-->

(C程序)为什么加上fflush(stdin)后才正常显示输入(scanf函数能正常工作)呢?

2020-04-22 10:25发布

问题:

请大佬救救孩子!
不加fflush(stdin):运行时没有让输入(程序中是有scanf函数的)

加上以后,运行就正常了:

以下是我原来的代码:

include "stdio.h"

main ()
{
int a[15]={1,3,6,7,9,13,56,57,74,81,90,91,94,100,102};
int min = 0, middle = 7, max = 14, i, number, n = 0;
char c = 'y';
while(c == 'y')
{
printf("请输入要查找的数:");
scanf("%d", &number);
if(number < a[0] || number > a[14])
printf("不在表中\n");
else
for(i = 0; i < 4; i++)
{
if(number == a[middle])
{
printf("%d是数组中第%d个元素的值\n", number, middle+1);
n++;
break;
}
else if(number < a[middle])
{
max = middle - 1;
middle = (min + max) / 2;
}
else
{
min = middle + 1;
middle = (min + max) / 2;
}
}
if(n == 0)
printf("不在表中\n");
printf("是否要继续查找?y or n?");
scanf("%c",&c);
}

}

回答1:

使用scanf接受输入时,你最后输入的回车也会作为输入字符记录在缓冲区。
在你的程序中,你在命令行输入了一个数字和一个回车符。scanf第一次得到数字,第二次从缓冲区直接读取到了回车符,就不会再等待你输入内容到缓冲区了。此时c为回车符,while (c == 'y')自然就不成立,程序结束。

fflush就是清空缓冲区中多余字符,使得scanf等待你的输入。这个函数不是c标准库中的,可以用,当然如果考虑平台兼容性的话,可以考虑使用getchar()来读取缓冲区其他字符并丢弃,譬如:

int myflush() {
  char c;
  while((c = getchar()) != '\n') {
  }
return 0;
}



回答2:

fflush(stdin)对输入流进行fflush,c语言标准未定义,这是盖子自己定义的。建议不要这样写。