Linux的第一个小程序

举报
跳动的bit 发表于 2022/06/23 07:28:32 2022/06/23
【摘要】 1、\r&&\n回车概念换行概念老式打印机的例子 2、行缓冲区概念运行程序是什么现象 ❓可以看到输入 “hello bit” 后,程序停留 5 秒后退出程序运行程序是什么现象 ❓这里输出时把 \n 去掉可以看到字符串没带 \n ,程序停留 5 秒后再输出 “hello bit”sleep 比 printf 先执行 ?这是顺序结构,此处并没有判断、分支啥的,那肯定是从上至下执行。其实这里 s...

1、\r&&\n

  • 回车概念
  • 换行概念
  • 老式打印机的例子

2、行缓冲区概念

运行程序是什么现象 ❓

在这里插入图片描述

可以看到输入 “hello bit” 后,程序停留 5 秒后退出程序

请添加图片描述

运行程序是什么现象 ❓

这里输出时把 \n 去掉

在这里插入图片描述

可以看到字符串没带 \n ,程序停留 5 秒后再输出 “hello bit”

请添加图片描述

sleep 比 printf 先执行 ?

这是顺序结构,此处并没有判断、分支啥的,那肯定是从上至下执行。

其实这里 sleep 时,printf 已经执行了,也就是说,printf 已经执行了,并不代表信息会被我们看到。

在 sleep 期间,字符串存在哪 ?

这也是之前我们学过的一个概念 —— 缓冲区(在 C 语言进阶篇我们验证了它的存在 —— C文件操作),对于这个概念,在之前甚至到这篇文章结束,我们对它的理解都是浅薄,甚至是错误的,真正要理解缓冲区,大概会在 Linux 系统编程部分,学习基础 IO 后,才会真正理解 C/C++ 中的缓冲区。在此之前我们可以理解为,缓冲区本质上是一段内存空间,它可以暂存临时数据,在合适的时候刷新出去。其中这里:

【缓冲区在哪】

【缓冲区谁提供的】

【缓冲区刷新是谁刷新的,以及什么时候刷新,刷新到哪】

【为什么要存在缓冲区】

上面提到的问题,现阶段是不好回答的。

在此章中我们要了解的是 ”刷新" ?

刷新策略:

  1. 直接刷新,不缓冲
  2. 缓冲区写满,再刷新 —— 全缓冲
  3. 碰到 \n 就刷新 —— 行刷新(一般对应的设备是显示器)
  4. 强制刷新

注意这里的刷新指的是,把数据真正的写入磁盘、文件、显示器、网络等设备或文件。

之前也说过,任何一个 C 程序,在启动时,会默认打开三个流(它们的类型都是 FILE*):

  1. stdin 标准输入流 - 键盘
  2. stdout 标准输出流 - 屏幕
  3. stderr 标准错误流 - 屏幕

最后再解释下这里的现象,这里是往显示器上显示,默认的刷新方案是行刷新,而如上并没有 \n,所以不会刷新,只能把缓冲区写满或程序结束才能刷新,所以为了让它显示出来,需要强制刷新 fflush(stdout)

在这里插入图片描述

回车 vs 换行 ❓

回车和换行本质上是一个不同的概念。

在这里插入图片描述

很明显,当我们写完一行,使用换行继续写时,写入的位置是错误的。我们想让它换行后,写入的位置回到开头,这种方式叫回车。其实 \n 是有两种身份 —— 换行并回车,简称回车,如果只想换行呢,就可以使用 \r。

所以在一些老式键盘上,它的 Enter 键是这样的,往下换行,往左回车,按 Enter 就是换行并回车。

在这里插入图片描述

3、倒计时代码

原理:回车不换行,依次覆盖,使用 \r,需要注意的是没使用 \n,不能刷新,所以需要强制刷新

在这里插入图片描述

验证:

请添加图片描述

但是这里还有个问题,当 count 是从 10 开始时

在这里插入图片描述

现象:

请添加图片描述

根本原因是 10 是两个字符,所以这里每次回车覆盖时都只会覆盖第一个字符。这里我们就要有一个基本的理解 —— 显示器和键盘这样的设备统称为字符设备,体现在输入是字符,输出是字符,只不过被 scanf、printf 给格式化了,变成我们看到的数字了。

解决方法就是加上位宽来控制

在这里插入图片描述

验证:

请添加图片描述

4、进度条代码

效果图如下:

在这里插入图片描述

在这里插入图片描述

验证:

请添加图片描述
请添加图片描述

📝说明

在 Linux 中 sleep 是以秒为单位,usleep 是以微秒为单位的。

在这里插入图片描述

扩展一下,我们的 C/C++ 是支持颜色输出的 —— printf 默认输出的颜色是终端的颜色,如果想设置其它颜色,就需要用到控制命令:\033[m,控制命令以 033[ 开头,以 m 结尾,而中间是属性码,属性码之间用 ; 分隔。具体可以去百度 printf 颜色配置方案。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。