YYhotpot 2022-03-21 05:45 采纳率: 100%
浏览 40
已结题

为什么程序最后一段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;
}


  • 写回答

3条回答 默认 最新

  • 春休夏末 2022-03-21 09:36
    关注

    是一个回车符导致的 在26行输入的时候 肯定是先输入一个数字 然后按回车键确认,回车键会就是一个回车符 scanf("%d", &number) 读走了前面的数字 标准输入缓冲区还剩下一个回车符 到47行的时候 读取一个字符 就读了回车符, 然后48行回车符肯定不等’n' 、'N'的, 所以跳过了, 如果想解决的话, 可以在26行后面加一句 getchar();将无用的 回车符读取走,这样子就正常了, 同理 47行也是同样的原理,不过47行执行后的下一个读取时"%d"类型 所以不会影响到 ,不过比较好的写法还是也加上getchar();

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 创建了问题 3月21日

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析