鱼生富贵 2022-01-31 12:59 采纳率: 97.4%
浏览 55
已结题

用折半查找法查找数组中元素


#include<stdio.h>
#define N 15
int main()
{
    int i, number, top, bott, mid, a[N], flag = 1, sign, loca;
    char c;
    printf("enter data:\n");
    scanf_s("%d", &a[0]);
    i = 1;
    while (i < N)
    {
        scanf_s("%d", &a[i]);
        if (a[i] >= a[i - 1])
            i++;
        else
            printf("enter this data again:\n");
    }
    printf("\n");
    for (i = 0; i < N; i++)
        printf("%5d", a[i]);
    printf("\n");
    while (flag)
    {
        top = 0;
        bott = N - 1;
        sign = 0;
        printf("input number to look for:");
        scanf_s("%d", &number);
        if (number<a[0] || number>a[N - 1])
            loca = -1;
        while ((!sign) && (top <= bott))
        {
            mid = (top + bott) / 2;
            if (number == a[mid])
            {
                loca = mid;
                printf("Has found %d,its position is %d\n", number, loca + 1);
                sign = 1;
            }
            else if (a[mid] < number)
                top = mid+1;
            else
                bott = mid-1;
        }
        if (!sign || loca == -1)
            printf("cannot find %d.\n", number);
        printf("continue or not(Y/N)?");
        scanf_s("%c", &c, 1);
        if (c == 'n' || c == 'N')
            flag = 0;
    }
    return 0;
}

img


这个是有什么问题呢,是scanf_s函数输入字符的锅吗

  • 写回答

1条回答 默认 最新

  • 慕雪华年 C/C++领域新星创作者 2022-01-31 13:56
    关注

    截图要截图全,输入法挡住错误信息了🧐

    这个语句貌似并没有执行,我测试的时候没有输入YN就直接执行下一个语句了

     printf("continue or not(Y/N)?");
            scanf_s("%c", &c, 1);
    

    你的报错信息说的就是这个问题,因为你输入了y,并不是一个int类型,但是被下一句的scanf吃掉了

    printf("input number to look for:");
            scanf_s("%d", &number);//这个吃掉了你输入的y和n
    

    img


    调试发现是吞了上一次输入的回车

    img


    在前面加一个getchar就ok了

    img


    修改后源码

    //NO14 scanf输入报错
    #include<stdio.h>
    #define N 15
    int main()
    {
        int i, number, top, bott, mid, a[N], flag = 1, sign, loca;
        char c;
        printf("enter data:\n");
        scanf_s("%d", &a[0]);
        i = 1;
        while (i < N)
        {
            scanf_s("%d", &a[i]);
            if (a[i] >= a[i - 1])
                i++;
            else
                printf("enter this data again:\n");
        }
        printf("\n");
        for (i = 0; i < N; i++)
            printf("%5d", a[i]);
        printf("\n");
        while (flag)
        {
            top = 0;
            bott = N - 1;
            sign = 0;
            printf("input number to look for:");
            scanf_s("%d", &number);
            if (number<a[0] || number>a[N - 1])
                loca = -1;
            while ((!sign) && (top <= bott))
            {
                mid = (top + bott) / 2;
                if (number == a[mid])
                {
                    loca = mid;
                    printf("Has found %d,its position is %d\n", number, loca + 1);
                    sign = 1;
                }
                else if (a[mid] < number)
                    top = mid + 1;
                else
                    bott = mid - 1;
            }
            if (!sign || loca == -1)
                printf("cannot find %d.\n", number);
            getchar();
            printf("continue or not(Y/N)?");
            scanf_s("%c", &c, 1);
            if (c == 'n' || c == 'N')
                flag = 0;
        }
        return 0;
    }
    

    如果对你有帮助,还请点个采纳吧!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月8日
  • 已采纳回答 1月31日
  • 创建了问题 1月31日

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀