重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
fflush()函数是标准的作法。
南岸网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站等网站项目制作,到程序开发,运营维护。成都创新互联公司2013年至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联公司。
scanf("%*[^\n]%*c")是用扫描集将缓冲区中的字符全部读取来实现清除缓冲区的动作。
%*〔^\n〕将逐个读取缓冲区中的'\n'字符之前的其它字符,%后面的*表示将读取的这些字符丢弃,前遇到'\n'字符时便停止读取操作,此时,缓冲区中尚有一个'\n'字符遗留,所以后面的%*c将读取并丢弃这个遗留的换行符,这里的星号和前面的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个'\n'字符,所以将'\n'连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。
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);就可以了。
最简单的是用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);
有的时候会遇到这样的一个问题,程序如下
#include
int main(void)
{
int a;
char b;
scanf("%d".a);
scanf("%c",b);
printf("%d\n",a);
printf("%c\n",b);
}
如果在终端上输入3
打印如下:
3
打印出一个3和一个空行,我们就输入了一个3,本来还应该再输入一个字符的,这是怎么回事。
原因是当我们输入3后又输入了个回车,C语言取字符都是在字符输入缓冲区中读取的,我们输入3后回车,C语言就把这个回车放在字符缓冲区中,所以第二个scanf读取的是字符缓冲区中的内容。
如果要解决一个最简单的方法就是把这个字符用getchar()读出来抛掉,这个就可以让我们第二次输入字符了,但getchar()只能读一个,如果字符缓冲区中的内容有多个,或者不知道多少个,这就不好办了。
还有一种方法就是在scanf上做文章,C语言的scanf这个输入函数是很奇怪的,如果我把第二个scanf改一下,改成scanf("
%c",b);%c前面有个空格啊,这个空格是写在前面的,也就是在我们要输入之前,要读空白字符并忽略掉,如果你不输入一有效字符在终端不论按多少个回车空格tab等都是无效的,所以这样的scanf可以帮我们输入有效字符。
如果scanf写成scanf(" %c
",b);,前后都有一个空格,前加空格已经说过了,那后面加空格会出现什么情,注意,如果在后加个空格,当我们输入一个有效字符回车,发现还没有输完,还要继续输入,这怎么回是。在后面加空格是把我们输入有效字符后面的空白字符忽略了,此时我们必须要输一个有效字符才能终止输入。
再来说一下整型,如果把第一个scanf改成
int c ;
scanf("%d,%d",a,c);
输入两个整型的变量,且%d与%d这间有个,号。这种情况下,你在输入第一个数字后必须原样输出一个,号,后面的输入才有效,如果在输入的时候不加,号,在你输入第一个整型数据后,忽略其它所有字符和数字除了,号,加,号后,与紧跟,号后的数据被读入到变量c中,大家可以试,当前,号可以是其它任可字符,%d前后都可以加其它字符,都要原样输出才行。
另外,还可通过加__fpurge(stdin)函数清空输入缓冲区,此函数在头文件中。
如果是只是清空一行的话可以用
char c;
while((c = getchar()) != '\n' c != EOF);