请大佬救救孩子!
不加fflush(stdin):运行时没有让输入(程序中是有scanf函数的)
加上以后,运行就正常了:
以下是我原来的代码:
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);
}
}
使用scanf接受输入时,你最后输入的回车也会作为输入字符记录在缓冲区。
在你的程序中,你在命令行输入了一个数字和一个回车符。scanf第一次得到数字,第二次从缓冲区直接读取到了回车符,就不会再等待你输入内容到缓冲区了。此时c为回车符,while (c == 'y')
自然就不成立,程序结束。
fflush就是清空缓冲区中多余字符,使得scanf等待你的输入。这个函数不是c标准库中的,可以用,当然如果考虑平台兼容性的话,可以考虑使用getchar()来读取缓冲区其他字符并丢弃,譬如:
int myflush() {
char c;
while((c = getchar()) != '\n') {
}
return 0;
}
谢谢你,很清楚,终于明白了,٩(๑>◡<๑)۶
还有一点想问一下,while((c = getchar()) != '\n')中“!=”改成“==”也行吧,我觉得都是把回车字符给用掉了
@诸葛思颖·: ==
在这里的话不行呀,如果回车符之前还有别的字符,用==
就处理不了了。
譬如你输入的字符除了数字还输入了其他字符6 x ; ds \n
,这个循环的意思是如果还没有读到'\n'
就一直读下去,把空格后的x;ds\n
都从缓存读出来。
如果你输入的后面只有一个回车符\n
,那么其实不用循环了,只要执行一个getchar就可以了,不过实际上为了避免错误,还是一直读到回车符结束。
fflush(stdin)对输入流进行fflush,c语言标准未定义,这是盖子自己定义的。建议不要这样写。
有所领悟,谢谢你了