为什么程序最后一段Scanf()函数及后面的判定语句直接“失效”,程序自动循环了?《C程序设计(第五版)学习辅导》第六章-9题。

这是一段从升序排列的数组中查询数据位置的程序,在程序末尾有一段询问“是否继续查询”的语句,里面决定着程序是否要继续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的值来分析,然后我简单分析后修改如下,你结合现象和缓冲区这个知识点理解一下:

img