鱼C论坛

 找回密码
 立即注册
查看: 2164|回复: 8

[已解决]为啥最后一个sacnf()函数一开始不执行呢,路过的大神进来帮忙调教下呗

[复制链接]
发表于 2018-3-12 08:17:45 | 显示全部楼层 |阅读模式
10鱼币
一开始没执行到最后一个scanf()函数,直到输入n或是N才直接退出
因为系统问题装的编译器都调试不了,所以来不耻下问了
#include <stdio.h>

//在一个从大到小排序的15个数中找打输入的数 
//使用折半查找法 

#define MAX 15 

int main(void)
{
        int array[MAX];
        int i, j, temp, flag;        //临时变量 
        int up, low, shuru;        //上限变量 下限变量 查找数 
        char ch;
        
        
        printf("请输入数字:\n");
        scanf("%d", &array[0]);
        i = 1;
        while(i < MAX)
        {
                scanf("%d", &array[i]);
                if(array[i] >= array[i-1])
                {
                        i++;
                }
                else
                {
                        printf("输入的数不比前一个数小,请重新输入:");
                }
        }
        
        printf("\n");
        for(i = 0; i < MAX; i++)
        {
                printf("%5d", array[i]);
        }
        
        flag = 1;        
        
        while(flag)
        {
                printf("\n请输入一个该数组中数字:");
                scanf("%d", &shuru);        
                temp = 0;                //开关变量 
                low = 0;
                up = MAX-1;         
                if((shuru < array[0]) || (shuru > array[MAX-1]))
                {
                        j = -1;
                }
                while((!temp) && (low <= up))
                {
                        i = (up+low)/2;
                        if(shuru == array[i])
                        {
                                j = i;
                                printf("数字 %d 在数组元素中的第%d位!\n", shuru, j+1);
                                temp = 1;        
                        }
                        else if(shuru < array[i])
                        {
                                up = i - 1;
                        }
                        else
                        {
                                low = i + 1;
                        }
                }
                
                if(!temp || j == -1)
                {
                        printf("数字%d在数组中找不到!\n", shuru); 
                }
                
                printf("\n是否继续查找:(Y/N)");
                scanf("%c", &ch);
                
                if(ch == 'N' || ch == 'n')
                {
                        flag = 0;
                }
        }
        
        getch();
        return 0;
}
最佳答案
2018-3-12 08:17:46
本帖最后由 BngThea 于 2018-3-12 08:56 编辑

每一个scanf后面加一句
getchar();
清理一下输入流中的回车符
搜狗截图20180312081642.png

最佳答案

查看完整内容

每一个scanf后面加一句 getchar(); 清理一下输入流中的回车符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-12 08:17:46 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 BngThea 于 2018-3-12 08:56 编辑

每一个scanf后面加一句
getchar();
清理一下输入流中的回车符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-12 10:41:46 | 显示全部楼层
后一个scanf因为是接收一个char字符,把回车吃了,没吃到Y或者是N,,在后一个scanf加一个getchar或加个头文件stdlib.h,并在后一个scanf前加一个fflush(stdin);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-12 11:00:58 | 显示全部楼层
#include <stdio.h>
#define MAX 15 
int main(void)
{
        int array[MAX];
        int i, j, temp, flag;       
        int up, low, shuru;       
        char ch;
        
        
        printf("请输入数字:");
        scanf("%d", &array[0]);
        i = 1;
        while(i < MAX)
        {
                scanf("%d", &array[i]);
                if(array[i] >= array[i-1])
                {
                        i++;
                }
                else
                {
                        printf("输入的数不比前一个小,请重新输入:");
                }
        }
        
        printf("\n");
        for(i = 0; i < MAX; i++)
        {
                printf("%5d", array[i]);
        }
        
        flag = 1;        
        
        while(flag)
        {
                printf("\n请输入一个该数组中的数字:");
                scanf("%d", &shuru);       
                                getchar(); 
                temp = 0;                
                low = 0;
                up = MAX-1;         
                if((shuru < array[0]) || (shuru > array[MAX-1]))
                {
                        j = -1;
                }
                while((!temp) && (low <= up)&&j != -1)
                {
                        i = (up+low)/2;
                        if(shuru == array[i])
                        {
                                j = i;
                                printf("数字 %d 在数组元素中的第 %d 位!\n", shuru, j+1);
                                temp = 1;        
                        }
                        else if(shuru < array[i])
                        {
                                up = i - 1;
                        }
                        else
                        {
                                low = i + 1;
                        }
                }
                
                if(!temp || j == -1)
                {
                        printf("数字%d在数组中找不到!\n", shuru); 
                }
                printf("\n是否继续查找(Y/N):");     //我觉得你的代码应该改成输入n退出,任意键继续。 
                scanf("%c", &ch);
                
                if(ch == 'N' || ch == 'n')
                {
                        flag = 0;
                }
        }
        return 0;
}
这个是可以运行的,感觉还有其他问题,你可以再修改一下,更美观舒适。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-12 11:04:20 | 显示全部楼层
代码问题就是那个scanf函数相当于接受了一个 回车键 所以,不需要你输入了

产生这个问题的原因,还是因为我给你注释部分,你只是检测了输入是不是n但是并没有检查是不是其他字符,

所以,输入任意其他字符都会继续,此时,输入的相当于回车所以,他就自动继续了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-12 19:12:39 | 显示全部楼层
BngThea 发表于 2018-3-12 08:32
每一个scanf后面加一句
getchar();
清理一下输入流中的回车符

一语惊醒梦中人,了解了,多谢大神调教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-12 19:13:21 | 显示全部楼层
夜猫子侠客 发表于 2018-3-12 10:41
后一个scanf因为是接收一个char字符,把回车吃了,没吃到Y或者是N,,在后一个scanf加一个getchar或加个头 ...

说的通俗易懂,那么会教人,是不是老湿~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-12 19:15:29 | 显示全部楼层
Zmynx_2017 发表于 2018-3-12 11:04
代码问题就是那个scanf函数相当于接受了一个 回车键 所以,不需要你输入了

产生这个问题的原因,还是因 ...

真是太感谢了,还劳烦修改代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-12 19:16:55 | 显示全部楼层
关键是都对,俺就按回复时间设置为最佳哈,三楼四楼有心了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-1 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表