首页 新闻 搜索 专区 学院

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

0
悬赏园豆:5 [已解决问题] 解决于 2020-04-22 10:35

请大佬救救孩子!
不加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);
}

}

诸葛思颖的主页 诸葛思颖 | 初学一级 | 园豆:172
提问于:2020-04-21 22:22
< >
分享
最佳答案
1

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

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

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

收获园豆:4
。淑女范erり | 小虾三级 |园豆:799 | 2020-04-22 09:13

谢谢你,很清楚,终于明白了,٩(๑>◡<๑)۶

诸葛思颖 | 园豆:172 (初学一级) | 2020-04-22 10:35

还有一点想问一下,while((c = getchar()) != '\n')中“!=”改成“==”也行吧,我觉得都是把回车字符给用掉了

诸葛思颖 | 园豆:172 (初学一级) | 2020-04-22 10:38

@诸葛思颖·: ==在这里的话不行呀,如果回车符之前还有别的字符,用==就处理不了了。
譬如你输入的字符除了数字还输入了其他字符6 x ; ds \n,这个循环的意思是如果还没有读到'\n'就一直读下去,把空格后的x;ds\n都从缓存读出来。

如果你输入的后面只有一个回车符\n,那么其实不用循环了,只要执行一个getchar就可以了,不过实际上为了避免错误,还是一直读到回车符结束。

。淑女范erり | 园豆:799 (小虾三级) | 2020-04-22 11:06
其他回答(1)
1

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

收获园豆:1
窗户 | 园豆:874 (小虾三级) | 2020-04-21 23:11

有所领悟,谢谢你了

支持(0) 反对(0) 诸葛思颖 | 园豆:172 (初学一级) | 2020-04-22 08:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册