C语言中gets()函数和清空缓冲区问问题
scanf(“%*[^\n]”);
^取反或者“非”,[^\n]就是除了回车什么都可以被scanf读到。*表示被读到了但是不把读到值或者字符赋值给任何变量。
%*[^\n]就是读取来自键盘的出去回车外的任意字符,并不赋值给变量。
scanf(“%*c”);
就一个*,和上边表示一样就是读到了不赋值给任何变量。
再看,scanf(“%[^\n]%*c”,str)读入一行字符,赋值给str变量。如果c前面没有*,那么就需要str后面再写一个char类型的ch。这就告诉你*表示读到了但是不赋值给任何变量。
那么scanf(“%*[^\n]%*c”)这句话,应该能理解吧,两个格式控制符里面都有*,就是都读到了都不赋值变量。
读到这里你应该差不多理解了,就是你的题中的两句scanf(相当于scanf(“%*[^\n]%*c”))读到了你输入的abc,但是没有赋值给任何变量。然后到了gets(str4);读到了def赋值给str4,然后printf(“%s\n”, str4);后必然显示def。
清空缓存区用fflush(stdin);这句代码。
键盘输入的东西都是放在缓冲区的这款区域,有变量过来了就带走,没有变量就在那里呆着等待一个变量来带它走。但是这个时候缓冲区里面偶尔会有一些垃圾的字符,而影响了正常的输入,有的时候用getchar()带走一个两个的字符,但是如果还是不见效一句fflush(stdin);就可以了。
C语言中如何清空输入输出缓冲区
最简单的是用fflush()函数。
此函数包含在stdio.h头文件中,用来强制将缓冲区中的内容写入文件。
函数原型:int
fflush(FILE
*stream)
;
函数功能:清除一个流,即清除文件缓冲区.
常用场合:
一、ff(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结
束)。
①
遇空格、“回车”、“跳格”键。
②
遇宽度结束。
③
遇非法输入。
键盘缓冲区就可能有残余信息问题。
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中
解决就要在scanf()函数之后加个fflush(stdin)
三、写文件的时候
不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写
FILE
*fp=fopen(“a.txt”,”w”);
fprintf(fp,”abcdef”);
fflush(fp);
C语言中的清空键盘缓冲区的fflusf(stdin)在哪些情况下可以不用?
能用到这个函数说明你已经不是入门阶段了,讲起来会轻松一点。在你要按确定的格式读东西,但是键盘缓冲区里可能还有在上次读入后用户按下的其他的按键信息,如果读了这些信息必然得不到正确的输入信息,所以这是要清空键盘缓冲区。有时,在需要忽略用户的部分输入或其他一些情况下也要情况输入缓冲区。 举个例子:你的程序在完成了某个持续一定时间的计算之后,需要用户输入一些信息以进行下一步操作的时候,就要先清空输入缓冲区,再读用户输入信息。因为在你的程序进行上一次运算期间,用户很可能有意无意的按了键盘,(这里请注意按一个键和这个键对应的内容在屏幕上显示出来时两回事)这些按键虽然没有显示出来,但是已经存在了键盘缓冲区中,下一次读入操作会读到这些按键,这并不是我们想要的。
c语言清除缓冲区的数据?
while(getchar()!=’n’); — 应当是 while(getchar()!=’\n’); 这是不断循环取字符,直到取到 Enter 键时结束循环。作用,清除上面一次输入时残留在输入流中的字符。
改用 fflush(stdin); 更佳。
ret = scanf(“%d,%d”,a,b); ret 为成功读得的数据个数。
清除的缓冲区中的残留数据: if (ret != 2) fflush(stdin);
C语言中清空缓冲区问题
奇怪的问题!
scanf中*的作用之一是忽略掉指定的内容, 比如 scanf (“%d %*s %d”, i, k),输入12 aaa 34,执行后i = 12, k = 34, aaa被忽略掉。这个与缓冲区有关系吗?
scanf (“%*”, buf); //这条语句忽略掉输入的任何字符(\n不忽略)。
至于这条语句scanf(“%*^[\n]”);连\n也忽略掉了, 程序直接终止在scanf,唯一的方法就是发送sigkill信号终止程序了。