鱼C论坛

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

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

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

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

  4. #define MAX 15

  5. int main(void)
  6. {
  7.         int array[MAX];
  8.         int i, j, temp, flag;        //临时变量
  9.         int up, low, shuru;        //上限变量 下限变量 查找数
  10.         char ch;
  11.        
  12.        
  13.         printf("请输入数字:\n");
  14.         scanf("%d", &array[0]);
  15.         i = 1;
  16.         while(i < MAX)
  17.         {
  18.                 scanf("%d", &array[i]);
  19.                 if(array[i] >= array[i-1])
  20.                 {
  21.                         i++;
  22.                 }
  23.                 else
  24.                 {
  25.                         printf("输入的数不比前一个数小,请重新输入:");
  26.                 }
  27.         }
  28.        
  29.         printf("\n");
  30.         for(i = 0; i < MAX; i++)
  31.         {
  32.                 printf("%5d", array[i]);
  33.         }
  34.        
  35.         flag = 1;       
  36.        
  37.         while(flag)
  38.         {
  39.                 printf("\n请输入一个该数组中数字:");
  40.                 scanf("%d", &shuru);       
  41.                 temp = 0;                //开关变量
  42.                 low = 0;
  43.                 up = MAX-1;        
  44.                 if((shuru < array[0]) || (shuru > array[MAX-1]))
  45.                 {
  46.                         j = -1;
  47.                 }
  48.                 while((!temp) && (low <= up))
  49.                 {
  50.                         i = (up+low)/2;
  51.                         if(shuru == array[i])
  52.                         {
  53.                                 j = i;
  54.                                 printf("数字 %d 在数组元素中的第%d位!\n", shuru, j+1);
  55.                                 temp = 1;       
  56.                         }
  57.                         else if(shuru < array[i])
  58.                         {
  59.                                 up = i - 1;
  60.                         }
  61.                         else
  62.                         {
  63.                                 low = i + 1;
  64.                         }
  65.                 }
  66.                
  67.                 if(!temp || j == -1)
  68.                 {
  69.                         printf("数字%d在数组中找不到!\n", shuru);
  70.                 }
  71.                
  72.                 printf("\n是否继续查找:(Y/N)");
  73.                 scanf("%c", &ch);
  74.                
  75.                 if(ch == 'N' || ch == 'n')
  76.                 {
  77.                         flag = 0;
  78.                 }
  79.         }
  80.        
  81.         getch();
  82.         return 0;
  83. }
复制代码

最佳答案
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 | 显示全部楼层
  1. #include <stdio.h>
  2. #define MAX 15
  3. int main(void)
  4. {
  5.         int array[MAX];
  6.         int i, j, temp, flag;      
  7.         int up, low, shuru;      
  8.         char ch;
  9.         
  10.         
  11.         printf("请输入数字:");
  12.         scanf("%d", &array[0]);
  13.         i = 1;
  14.         while(i < MAX)
  15.         {
  16.                 scanf("%d", &array[i]);
  17.                 if(array[i] >= array[i-1])
  18.                 {
  19.                         i++;
  20.                 }
  21.                 else
  22.                 {
  23.                         printf("输入的数不比前一个小,请重新输入:");
  24.                 }
  25.         }
  26.         
  27.         printf("\n");
  28.         for(i = 0; i < MAX; i++)
  29.         {
  30.                 printf("%5d", array[i]);
  31.         }
  32.         
  33.         flag = 1;        
  34.         
  35.         while(flag)
  36.         {
  37.                 printf("\n请输入一个该数组中的数字:");
  38.                 scanf("%d", &shuru);      
  39.                                 getchar();
  40.                 temp = 0;               
  41.                 low = 0;
  42.                 up = MAX-1;         
  43.                 if((shuru < array[0]) || (shuru > array[MAX-1]))
  44.                 {
  45.                         j = -1;
  46.                 }
  47.                 while((!temp) && (low <= up)&&j != -1)
  48.                 {
  49.                         i = (up+low)/2;
  50.                         if(shuru == array[i])
  51.                         {
  52.                                 j = i;
  53.                                 printf("数字 %d 在数组元素中的第 %d 位!\n", shuru, j+1);
  54.                                 temp = 1;        
  55.                         }
  56.                         else if(shuru < array[i])
  57.                         {
  58.                                 up = i - 1;
  59.                         }
  60.                         else
  61.                         {
  62.                                 low = i + 1;
  63.                         }
  64.                 }
  65.                
  66.                 if(!temp || j == -1)
  67.                 {
  68.                         printf("数字%d在数组中找不到!\n", shuru);
  69.                 }
  70.                 printf("\n是否继续查找(Y/N):");     //我觉得你的代码应该改成输入n退出,任意键继续。
  71.                 scanf("%c", &ch);
  72.                
  73.                 if(ch == 'N' || ch == 'n')
  74.                 {
  75.                         flag = 0;
  76.                 }
  77.         }
  78.         return 0;
  79. }
复制代码
这个是可以运行的,感觉还有其他问题,你可以再修改一下,更美观舒适。
想知道小甲鱼最近在做啥?请访问 -> 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-4-23 23:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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