C学习网:链接->C学习网
C训练网:链接->C训练网
在《结合C语言缓冲区谈scanf()函数》一节中讲到,scanf() 的缓冲区有时会引发奇怪的问题,多个 scanf() 之间要注意清空缓冲区。清空缓冲区主要有两种思路:一是将缓冲区中的数据丢弃,二是将缓冲区中的数据读取出来,但是却不使用。
int fflush(FILE *stream)
stream 为流指针,可以理解为一个文件指针。在C语言中,为了便于操作,键盘和显示器也被看作是文件,这样对硬件的操作就等同于对文件的操作。键盘称为标准输入文件(stdin),显示器称为标准输出文件(stdout),这在《C语言文件概述》一节中有详细讲解。fflush(stdin);
请看下面的代码:
- #include<stdio.h>
- #include<stdlib.h>
- int main()
- {
- int a, b;
- scanf("%d", &a);
- fflush(stdin);
- scanf("%d", &b);
- printf("a=%d, b=%d\n", a, b);
- system("pause");
- return 0;
- }
- int c;
- while((c = getchar()) != '\n' && c != EOF);
\n
或者是文件结尾符EOF
为止。这个方法可以完美清空输入缓冲区,并且具备可移植性。
- scanf("%*[^\n]%*c");
%*[^\n]
将逐个读取缓冲区中的 '\n' 字符之前的其它字符,% 后面的 * 表示将读取的这些字符丢弃,遇到 '\n' 字符时便停止读取。此时,缓冲区中尚有一个 '\n' 字符遗留,所以后面的%*c
将读取并丢弃这个遗留的换行符,这里的星号和前面的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个 '\n' 字符,所以将 '\n' 连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。
- #include<stdio.h>
- #include<stdlib.h>
- int main()
- {
- int a, b;
- char c;
- scanf("%d", &a);
- scanf("%*[^\n]%*c");
- scanf("%d", &b);
- printf("a=%d, b=%d\n", a, b);
- scanf("%d", &a);
- while((c = getchar()) != '\n' && c != EOF);
- scanf("%d", &b);
- printf("a=%d, b=%d\n", a, b);
- system("pause");
- return 0;
- }
fflush(stdin);
,简单明了;如果兼顾移植和效率,建议使用scanf("%*[^\n]%*c");
,虽然有点蹩脚,但确实能够奏效。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。