有的时候会遇到这样的一个问题,程序如下
#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)函数清空输入缓冲区,此函数在头文件中。
B. C语言如何清除键盘输入缓存区
如果是只是清空一行的话可以用
charc;
while((c=getchar())!=' '&&c!=EOF);
C. c语言清楚缓存的两种方法fflush(stdin)和)scanf("%[^\n]%*c")。scanf("%[^\n]%*c")怎么理解。还有跪求区
fflush()函数是标准的作法。
scanf("%*[^\n]%*c")是用扫描集将缓冲区中的字符全部读取来实现清除缓冲区的动作。
%*〔^\n〕将逐个读取缓冲区中的'\n'字符之前的其它字符,%后面的*表示将读取的这些字符丢弃,前遇到'\n'字符时便停止读取操作,此时,缓冲区中尚有一个'\n'字符遗留,所以后面的%*c将读取并丢弃这个遗留的换行符,这里的星号和前面的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个'\n'字符,所以将'\n'连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。
D. c语言。清除键盘缓存的作用是什么
因为键盘缓冲区里的信息会影响下一次对标准输入的读取,所以一般用while和getchar清除缓存区里的值
E. 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);
F. C语言中清除内存缓冲区的函数是什么
C语言中清除内存缓冲区的函数是fflush(
),清除输入缓冲区用fflush(stdin);
其中stdin表示标准输入。
该函数通常用在输入类函数的前面,用以清除输入缓冲区中的内容,避免接收到上次残留的内容而出错。
举例如下:
1、不加fflush函数:
// 将输入的5个字符存放到数组str中,并输出
int i;
char ch, str[6]={'\0'};
for(i=0; i<5; i++)
{
scanf("%c", &ch);
str[i] = ch;
}
printf("%s\n", str);
// 程序只能输入三个字符(每个字符间包含一个回车符),因为不加fflush函数时,将残留在缓冲区中的回车符也当成了一个字符输入到数组str中。
2、加fflush函数:
int i;
char ch, str[6]={'\0'};
for(i=0; i<5; i++)
{
fflush(stdin); // 清除留在缓冲区中的回车符,确保接收到的是用户输入的字符
scanf("%c", &ch);
str[i] = ch;
}
printf("%s\n", str);
// 程序能正常输出
G. c语言传文件清空缓存
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);就可以了。