c语言中关于scanf输入与%c和%s的使用问题(附带缓冲区讲解)

Elsa ·
更新时间:2024-11-10
· 857 次阅读

scanf的输入问题 //这里是举例代码。 #include int main(void) { char ch; scanf("%c", &ch); while(ch != 'g') { printf("%c",ch); scanf("%c",&ch); } return 0: } 此题摘抄于C Primer plus 第六版第六章复习题第八题
当我们输入Go west,young man!时程序的运行结果是:Go west,youn
在弄清此题之前有必要先弄清计算机的输入输出与缓存区问题:计算机的标准输入stdin输出stdout并不是直接读取键盘里的数据,而是从缓冲区里读入数据。那么什么是缓冲区呢?缓冲区解释:即一块内存区,用在输入输出设备和cpu之间,用来缓存数据,是低速的输入输出设备和高速的cpu能协调工作,解放CPU,使其高效工作。

缓冲区分为三种:

全缓冲 行缓冲 不带缓冲
全缓冲:填满标准I/O缓存后才进行实际I/O操作。
即一次I/O操作就是一次请求,对于磁盘,一次I/O操作就是读或写磁盘某段扇区,读写完毕,I/O结束。eg:磁盘文件读写。

行缓冲:输入输出遇\n,执行I/O操作。输入字符先存放在缓存区,按下回车键才进行实际I/O操作。eg:键盘输入数据。

不带缓冲:eg:标准出错情况stderr,使出错信息尽快显示。

那么回归本体,本题涉及到标准输入即为行缓冲。scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式为只接收一个字符。那么当我们输入Go west,young man!时实际上这些字符只是存在与缓冲区中,当我们按下回车键(\n)时,I/O操作才开始执行。此时第一个scanf执行并录入’G‘,进行循环语句判断,之后的scanf会直接从缓冲区中读入接下来的字符,因此while循环语句会自动不断执行直至遇到’g‘循环终止,退出程序。

同理%s也是如此,但是在使用%s时我们要注意一个问题,那就是空格问题。在使用%s输入字符时,若遇到空格(space)那么后面的字符将不在录入。看个例子 #include int main(void) { char name[20]; scanf("%s",name); printf("%s\n",name); }

程序执行结果:在这里插入图片描述

我再啰嗦的向大家拓展一下会车符(\n)也是会被记入缓冲区的,语言没有说服力那就看看代码吧!

#include int main(void) { char ch1,ch2; printf("输入ch1:\n"); scanf("%c",&ch1); printf("ch1:%c\n",ch1); printf("输入ch2:\n"); scanf("%c",&ch2); printf("ch2:%c\n",ch2); }

程序执行结果:

这里我只输入了’a‘和回车键,可以看到ch2没有赋值(或者说赋值回车)但是当我输入’‘ab’'时在这里插入图片描述
这同样也佐证了上面的道理。

以上就是我个人对scanf以及%c %s 的输入问题和缓冲区问题的看法,以上说明仅代表我个人观点,如有错误以及说明不恰当的地方欢迎各位批评指正,有问题也可以私信我,我们一起探讨解决。如有喜欢的欢迎各位关注我的博客,大家可以相互学习。
作者:彡小小怪下次努力



c语言中 缓冲 scanf C语言

需要 登录 后方可回复, 如果你还没有账号请 注册新账号