c语言中scanf等函数关于输入流缓冲区

来源:互联网 发布:php 去除井号 编辑:程序博客网 时间:2024/04/29 13:48

突然想起来c语言中常用的scanf函数还有getchar函数有可能会遇到关于缓冲区未被清空导致输入出现问题的情况。

刚刚学c的时候有道练习题遇到了键盘输入缓冲区出现的问题,然后今天同学做课设题目也遇到了相同的问题老师居然一时没解答出来--。

回来看了下大概的解释,写下来算是作为记录吧。

相对于getche()getche(),scanf()和getchar()是stdioh库里的函数,像我这种初学c的基本上输入都用getchar()和scanf()来解决。然而遇到大量输入的话就可能出现问题--。比如

#include<stdio.h>int main (){  char c;  while((c = getchar())!='\n')        printf("%c",c); printf("end"); return 0;}

当你输入多个字符时这一段代码就会把你输入的一整串字符串都输出来,getchar()不是只读取一个字符吗--。

然而这并不是偶然.....

getchar()并不是从键盘直接读取字符,而是等你输入完成,比如输入一整串字符你会按个回车表示你输入完成了对吧,那么这个回车就是一个标志,从键盘读到回车符的时候程序才会进入getchar()这个函数,而你之前输入的东西都会被存放在内存中有一块叫输入流缓冲区的地方,任晗getchar()就开始在缓冲区读取字符,当它读完第一个字符后释放了那个字符所占的内存,但是你之前输入的是一大串字符,后面还有一段串字符等着被getchar()“临幸”,所以上述程序会把你输入的全部都输出。

那么你做一大段输入的时候就有可能出现某处该输入却被程序直接跳过然后然后然后你就会发现被跳过的居然有值....明明我都没输入呢.....

所以在多输入语句的情况下需要清空输入流缓冲区来保证你的每一个需要输入的语句都能得到你想给他的值。

在windows环境下可以用fflush(stdin); rewind(stdin);等函数来清空输入流缓冲区....也可能还有其他函数可以达到目的...毕竟程序的世界很奇妙。

然而上面说到的两个函数在linux环境下不适用,就好像system("cls")清屏函数在windows下可以用在linux得改用system("clean")....哈哈

那么在linux下可以用setbuf(stdin,NULL);

os x下不清楚--。毕竟没用过x_x

放一篇讲的很详细的大神的blog点击打开链接


0 0