Code Bye

c实现二分查找问题

假如在能否继续后的输入语句中加一个空格,运行时就可以输入,但是不加空格就直接跳转到请输入数字的位置,问一下是怎么回事呢
#include <stdio.h>
int main(){
    int arr[15] = {3,6,9,14,19,47,49,55,62,91,124,234,398,576,999};
    int num,top,bott,mid,flag = 1,loc,sign = 0;
    char c;
    while(flag){
        printf("请输入要查找的数字:");
        scanf("%d",&num);
        top = 0;
        bott = 14;
        if(num < arr[top] || num > arr[bott])
            loc = -1;
        while(!sign && top <= bott){
            mid = (top + bott) / 2;
            if(num == arr[mid]){
                loc = mid;
                printf("%d在第%d位置上\n",num,loc + 1);
                sign = 1;
            }else if(num <= arr[mid]){
                bott = mid - 1;
            }else{
                top = mid + 1;
            }
        }
        if(!sign || loc == -1)
            printf("找不到%d\n",num);
            
        printf("能否继续Y/N:");
        scanf("%c",&c);
        if(c == "N" || c == "n")
            flag = 0;
    }
    return 0;
}
解决方案

10

在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];

20

原因是%c会读取掉遗留的回车符.
举个例子:例如你输入5按下回车,此时输入缓冲区是5\n
scanf(“%d”,&num);仅仅是读取掉了5(此时输入缓冲区为\n)
等到执行到scanf(“%c”,&c);由于输入缓冲区不为空,所以scanf会直接读取遗留的回车符从而看起来像跳过了这句
解决方法:
scanf(“%c”,&c);前面加一句getchar();或fflush(stdin);都行

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c实现二分查找问题