输入流缓冲区举例说明及解决方案

导读:对C语言输入输出流和缓冲区的深入理解,C语言缓冲区(缓存)详解,缓冲区又称为缓存,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区,为什么要引入缓冲区,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区  ( 摘自博主名为V-Man)

程序说明:

                   

5行:首先执行程序输入:abc回车;

6行:首先打印出来97(a);

7行:跳过用户按键,getchar()直接从输入流中读取字符,然后与‘\n’比较是否相等,相等为0,不想等为1,再传送给c。

11行:暂停


#重点来了

整个流程:abc 在输入界面的时候就已经存入输入流缓冲区中了,通过回车(’\n‘)执行程序(回车也会被存入输入流缓冲区中),然后每次通过getchar从输入流缓冲区中读取一个字符。

总而言之————输入流缓冲区的存在,使得编译器从键盘读到回车符的时候程序才会进入getchar()这个函数,getchar()才开始挨个读取字符。


问题(一):那么这里有多少个字符保存在输入流缓冲区中呢?

答案:是3+1=4个字符(6:3个字母 ,1:代表’\n‘及是回车)(这里注意一下,对于getchar(),scanf()会以回车为结束标志 但却会将回车作为字符存入缓冲中去,这里不细讲)。

问题(二):getchar()被调用多少次?

答案:4次(直到遇到’\n‘,注意最后是接收了'\n'然后进行比较了的,有种光单独使用getchar()接收字符而不进行其他操作,这是可行的,用来清除缓冲区)。

问题(三):如果我们不输出或者不清除输入流缓冲区的数据有什么后果呢?

答案是:一直存在输入流缓冲区中,等到再次需要读取数据时,你不会有输入机会及是跳过用户按键,会被getchar(),scanf()等等 直接接收来自输入流缓冲区的数据。


备注:这只是举例简单说明了输入流缓冲区,getchar(),scanf()等等都是通过读取输入流缓冲区的数据,知道这些对于新             生应该足够适用了。

附加题(留给读者):   而有没有不是通过输入流缓冲区的呢,由键盘直接输入?

          

如何清空输入流缓冲区:

提供二种解决初学者问题办法:1.在windows环境下可以直接使用fflush(stdin); rewind(stdin);函数进行清除输入流缓冲区的字符

2.还有个较为常用的循环是while (getchar() != '\n')   { continue; } 自己体会。  


若文章有问题 或者建议请在下方留言!!

此外:本人至今是软件工程大一新生,希望能认识更多志同道合的人共同努力,交流学习经验,也可在下方留下联系方式!!