与市场营销有关的网站,广州知名网站推广,推广怎么做才可以赚钱,淄博网站建设服务商#x1f466;个人主页#xff1a;Weraphael ✍#x1f3fb;作者简介#xff1a;目前正在学习c和Linux还有算法 ✈️专栏#xff1a;Linux #x1f40b; 希望大家多多支持#xff0c;咱一起进步#xff01;#x1f601; 如果文章有啥瑕疵#xff0c;希望大佬指点一二 … 个人主页Weraphael ✍作者简介目前正在学习c和Linux还有算法 ✈️专栏Linux 希望大家多多支持咱一起进步 如果文章有啥瑕疵希望大佬指点一二 如果文章对你有帮助的话 欢迎 评论 点赞 收藏 加关注 目录 一、回车和换行二、缓冲区三、实现倒计时程序四、实现进度条4.1 准备工作4.2 实现步骤之基础版4.3 实现步骤之增加百分比4.4 实现步骤之增加箭头4.4 实现步骤之增加旋转光标 一、回车和换行
回车和换行是两个不同的概念。
换行指的是将光标移动到下一行的开头位置。用\n表示。 回车指的是将光标移动到当前行的开头位。用\r表示。 printf打印的时候hello其实是正常打印的但是遇到了\r回车就将光标移动到当前行的开头位。于是Linux就把hello给覆盖掉了
二、缓冲区
在此之前先认识一个Linux下的函数sleep可以通过man手册来了解
sleep()函数是一个系统调用用于在C语言程序中暂停执行一段时间。
它的原型如下
#include unistd.hunsigned int sleep(unsigned int seconds);其中seconds参数表示暂停的时间长度单位为秒。在函数调用期间程序会进入睡眠状态不会进行任何操作直到指定的时间过去后恢复执行。
接下来言归正传来看看以下代码 这肯定难不倒大家。结果一定是hello Linux并且在程序结束前会延迟2秒 那如果我将以上代码稍作修改仅仅是将\n去掉了 有的人想这还需要问吗结果肯定和上面一样
ok我们看结果 好像和我们想的有点不太一样以上的结果是先执行sleep函数停顿2秒再执行printf输出的hello Linux。
可是执行顺序真的是以上这样的吗
当然不是我们知道程序都是按照顺序从上到下依次执行的。那么字符串hello Linux去哪了虽然不知道在哪但能保证它一定是存在的。那么它存哪了呢
答缓冲区。在Linux中C语言缓冲区buffer通常是指用于存储输入或输出数据的临时存储区域。缓冲区可以提高程序的效率减少对底层资源如磁盘、网络等的频繁访问次数。
需要注意的是默认情况下标准输出stdout是行缓冲的也就是说当遇到换行符‘\n’时输出缓冲区会被自动刷新。这也就为什么咱们第一个样例直接输出了字符串再停顿了2秒。
如果我们需要立即将缓冲区中的数据写入到目标设备可以使用fflush函数来手动刷新缓冲区。
fflush(stdout);可以通过man手册来了解fflush函数
man fflush接下来看看加上fflush函数的效果 上面说过遇到换行\n时输出缓冲区会被自动刷新。那么遇到回车\r输出缓冲区会被自动刷新吗我们可以一起做个实验 如上结果所示回车\r不会刷新缓冲区同样需要使用fflush函数来手动刷新缓冲区。
三、实现倒计时程序
首先以9秒举例 以上的代码逻辑比较简单我们直接运行程序看看效果 为了保证代码的正确性我们以10秒开始倒计时来看看效果 我们发现效果有点瑕疵。
实际上无论打印什么类型的数据显示在显示器上的内容都是一个个字符。显示器是由一个个像素组成的。每个像素可以显示不同的颜色或者字符。当你打印不同类型的数据时它们会被转换为字符形式并逐个显示在显示器上。
解决的办法也很简单指定域宽就行。 然后来看看效果 效果比之前好多了那左对齐是否就更好看些呢 来看看最终效果 四、实现进度条
4.1 准备工作
为了提高代码的可维护性、可扩展性和代码复用性我们采取多文件方式 为了方便编译代码再把makefile文件写出来 我们先把大致的框架写出来 4.2 实现步骤之基础版
首先需要保证进度条在一行不断向左移动到达100%后停下来
我们可开一个长度为101的字符数组其中100个存储进度条类型可以是、-等等根据需求来定最后多出来的字符我们可以给\0。那么起始我们可以将字符数组全部初始化为\0 我们进度条可以参考倒计时。进度为0%的时候什么也不打印进度为1%打印一个进度字符以此类推。那么们怎么保证一行可以的进度条不断向左移动我们可以使用回车\r并且每打印完一次进度字符后面的打印个数总要比前一次多1。 以上需要注意的是回车\r是不会自动刷新缓冲区的因此要手动刷新缓冲区
我们可以看看效果 我们发现以上打印速度太慢了循环100次那么就要打印100秒。因此这里再介绍一个函数usleep它和sleep函数功能一样唯一不同的是单位不一样它是以微妙为单位的。
那么如果循环100我们可以规定10内打印完那么循环一次就要0.1秒转化为微妙就是100000 要将0.1秒转换为微秒可以使用以下公式 1s 1000毫秒1毫秒 1000微秒因此微秒 秒 × 1000000 根据以上公式将0.1秒转换为微秒的计算如下 0.1秒 0.1 × 1000000 100000 微秒 我们再来看看效果 确实比之前快很多
4.3 实现步骤之增加百分比
增加百分比就非常简单了直接看代码吧 需要注意的是在许多编程语言中包括Java、C、C、Python等百分号%被用作格式化字符串的占位符用来表示将要被替换的部分。因此如果你想要在输出中打印一个百分号符号需要使用两个百分号来进行转义。
我们来看看效果 好像还是有点瑕疵右]好像随着精度条一起移动而我们希望的是想让其固定下来。
解决方法很简单指定域宽就行预留100个空间给进度字符# 好像还是有点瑕疵怎么是从右往左我们希望是从左向右
这是因为在C语言中格式化输出默认是右对齐的而负整数会向左对齐。 来看看最后的效果 4.4 实现步骤之增加箭头
对边界判断即可判断条件为i 100时就不应该出现箭头 来看看程序效果 4.4 实现步骤之增加旋转光标
我们可以类似于缓存的旋转光标。字符为| / - \。
需要注意的是在C语言中反斜杠\是一种转义字符。因此如果想要打印\需要将其转义\\ 来看看效果吧