这是一段从升序排列的数组中查询数据位置的程序,在程序末尾有一段询问“是否继续查询”的语句,里面决定着程序是否要继续While循环。但是它好像失效了?程序运行到Printf("Continue or not?(Y/N) ");之后就好像自动跳过了下面的scanf()和if()部分,直接循环了;请问是哪里出问题了吗?谢谢~
#代码如下:
#include<stdio.h>
#define N 15
int main(){
int i, a[N], loca, sign, mid, bott, top, flag = 1, number;
char ch;
printf("Enter data:\n");
scanf("%d", &a[0]);
for(i = 1; i < N; i ++){
scanf("%d", &a[i]);
while(a[i] < a[i - 1]){
printf("Enter error. The current data must be greater than before, enter again:\n");
scanf("%d", &a[i]);
}
}
printf("\n");
printf("The data is: \n");
for(i = 0; i < N; i ++){
printf("%5d", a[i]);
}
while(flag){
sign = 0;
top = 0;
bott = N - 1;
printf("\nWhich number that's you wanna look for? ");
scanf("%d", &number);
if(number < a[top] || number > a[bott]){
loca = -1;
}
while(!sign && top <= bott){
mid = (top + bott) / 2;
if(number == a[mid]){
printf("Has found. The position of %d is a[%d].\n", number, mid);
sign = 1;
}
else if(number > a[mid]){
top = mid + 1;
}
else{
bott = mid - 1;
}
}
if(loca == -1 || !sign){
printf("Sorry.cannot find it.\n");
}
printf("Continue or not?(Y/N) ");
scanf("%c", &ch);
if(ch == 'n' || ch == 'N'){
flag = 0;
}
}
return 0;
}
是一个回车符导致的 在26行输入的时候 肯定是先输入一个数字 然后按回车键确认,回车键会就是一个回车符 scanf("%d", &number) 读走了前面的数字 标准输入缓冲区还剩下一个回车符 到47行的时候 读取一个字符 就读了回车符, 然后48行回车符肯定不等’n' 、'N'的, 所以跳过了, 如果想解决的话, 可以在26行后面加一句 getchar();将无用的 回车符读取走,这样子就正常了, 同理 47行也是同样的原理,不过47行执行后的下一个读取时"%d"类型 所以不会影响到 ,不过比较好的写法还是也加上getchar();
getchar(); 暂停一下。 这里有清除缓冲区的作用,用scanf连续读入int型数据时,不会把后面的空(回车)清理掉,再读就出错。 最好的办法 是增加flushall()函数,每次scanf后清理缓冲区。tc2.0有这个问题,好像其他的vc等没有这个问题,可以不用这个语句。
这个与printf和scanf底层的缓冲区有关,关于这个细节你可以加打印看看c的值来分析,然后我简单分析后修改如下,你结合现象和缓冲区这个知识点理解一下: