鱼C论坛

 找回密码
 立即注册
查看: 895|回复: 2

[已解决]C程序出现了一个问题

[复制链接]
发表于 2020-5-12 10:36:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
主要在于后面的while语句中,当我按Y时正常循环,但是按小写y时却无效,直接退出。调试时则为按任意键退出。。试了很多次,都是这样。
  1. #include <stdio.h>
  2. #include <conio.h>

  3. void Hanoi(int n,char A,char B,char C)
  4. {
  5.         if (n <= 0)
  6.         {
  7.                 printf("错误!\n");
  8.         }
  9.         else if (n == 1)
  10.         {
  11.                 printf("把%c移到%c\n", A, C);
  12.         }
  13.        
  14.         else
  15.         {
  16.                 Hanoi(n - 1, A, C, B);
  17.                 printf("把%c移到%c\n",A,C);
  18.                 Hanoi(n-1,B,A,C);
  19.                   
  20.         }
  21. }

  22. void main()
  23. {
  24.         int n;
  25.         do
  26.         {
  27.                 printf("汉诺塔盘子数:\n");
  28.                 scanf("%d", &n);

  29.                 Hanoi(n, 'A', 'B', 'C');
  30.                 printf("再来一次?(y/s)");
  31.                
  32.                
  33.         } while (getchar()=='y'|| getchar()=='Y');
  34. }
复制代码

最佳答案
2020-5-12 10:47:12
本帖最后由 sunrise085 于 2020-5-12 10:49 编辑

两个问题:
1、循环内有scanf函数,结束后,缓存区会留下一个回车字符'\n',当你进行while条件判断的时候,getchar得到的是'\n'
2、while条件,写了两个getchar(),若第一次getchar读到的不是‘y',会再次读取一个字符

因为这两个问题,所以当你输入y的时候,第一次读到了'\n'与'y'比较,不符合条件,第二次读到'y'与'Y'比较,也不符合,就退出了。但若输入的是Y,第一次读到了'\n'与'y'比较,不符合条件,第二次读到'Y'与'Y'比较,符合条件,继续进入循环。
  1. #include <stdio.h>
  2. #include <conio.h>

  3. void Hanoi(int n,char A,char B,char C)
  4. {
  5.     if (n <= 0)
  6.     {
  7.         printf("错误!\n");
  8.     }
  9.     else if (n == 1)
  10.     {
  11.         printf("把%c移到%c\n", A, C);
  12.     }
  13.    
  14.     else
  15.     {
  16.         Hanoi(n - 1, A, C, B);
  17.         printf("把%c移到%c\n",A,C);
  18.         Hanoi(n-1,B,A,C);
  19.     }
  20. }

  21. void main()
  22. {
  23.     int n;
  24.     char ch;
  25.     do
  26.     {
  27.         printf("汉诺塔盘子数:\n");
  28.         scanf("%d", &n);
  29.         getchar();//清除缓存区的'\n'
  30.         Hanoi(n, 'A', 'B', 'C');
  31.         printf("再来一次?(y/s)");
  32.     } while (ch=getchar()=='y'|| ch=='Y');
  33. }
复制代码


或者把getchar放到循环内
  1. #include <stdio.h>
  2. #include <conio.h>

  3. void Hanoi(int n,char A,char B,char C)
  4. {
  5.     if (n <= 0)
  6.     {
  7.         printf("错误!\n");
  8.     }
  9.     else if (n == 1)
  10.     {
  11.         printf("把%c移到%c\n", A, C);
  12.     }
  13.    
  14.     else
  15.     {
  16.         Hanoi(n - 1, A, C, B);
  17.         printf("把%c移到%c\n",A,C);
  18.         Hanoi(n-1,B,A,C);
  19.     }
  20. }

  21. void main()
  22. {
  23.     int n;
  24.     char ch;
  25.     do
  26.     {
  27.         printf("汉诺塔盘子数:\n");
  28.         scanf("%d", &n);
  29.         getchar();//清除缓存区的'\n'
  30.         Hanoi(n, 'A', 'B', 'C');
  31.         printf("再来一次?(y/s)");
  32.         ch=getchar();
  33.     } while (ch=='y'|| ch=='Y');
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-12 10:38:54 | 显示全部楼层
第36行while (getchar()=='y'|| getchar()=='Y');你写了两边getchar(),所以C语言会读入两个字符
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-12 10:47:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-5-12 10:49 编辑

两个问题:
1、循环内有scanf函数,结束后,缓存区会留下一个回车字符'\n',当你进行while条件判断的时候,getchar得到的是'\n'
2、while条件,写了两个getchar(),若第一次getchar读到的不是‘y',会再次读取一个字符

因为这两个问题,所以当你输入y的时候,第一次读到了'\n'与'y'比较,不符合条件,第二次读到'y'与'Y'比较,也不符合,就退出了。但若输入的是Y,第一次读到了'\n'与'y'比较,不符合条件,第二次读到'Y'与'Y'比较,符合条件,继续进入循环。
  1. #include <stdio.h>
  2. #include <conio.h>

  3. void Hanoi(int n,char A,char B,char C)
  4. {
  5.     if (n <= 0)
  6.     {
  7.         printf("错误!\n");
  8.     }
  9.     else if (n == 1)
  10.     {
  11.         printf("把%c移到%c\n", A, C);
  12.     }
  13.    
  14.     else
  15.     {
  16.         Hanoi(n - 1, A, C, B);
  17.         printf("把%c移到%c\n",A,C);
  18.         Hanoi(n-1,B,A,C);
  19.     }
  20. }

  21. void main()
  22. {
  23.     int n;
  24.     char ch;
  25.     do
  26.     {
  27.         printf("汉诺塔盘子数:\n");
  28.         scanf("%d", &n);
  29.         getchar();//清除缓存区的'\n'
  30.         Hanoi(n, 'A', 'B', 'C');
  31.         printf("再来一次?(y/s)");
  32.     } while (ch=getchar()=='y'|| ch=='Y');
  33. }
复制代码


或者把getchar放到循环内
  1. #include <stdio.h>
  2. #include <conio.h>

  3. void Hanoi(int n,char A,char B,char C)
  4. {
  5.     if (n <= 0)
  6.     {
  7.         printf("错误!\n");
  8.     }
  9.     else if (n == 1)
  10.     {
  11.         printf("把%c移到%c\n", A, C);
  12.     }
  13.    
  14.     else
  15.     {
  16.         Hanoi(n - 1, A, C, B);
  17.         printf("把%c移到%c\n",A,C);
  18.         Hanoi(n-1,B,A,C);
  19.     }
  20. }

  21. void main()
  22. {
  23.     int n;
  24.     char ch;
  25.     do
  26.     {
  27.         printf("汉诺塔盘子数:\n");
  28.         scanf("%d", &n);
  29.         getchar();//清除缓存区的'\n'
  30.         Hanoi(n, 'A', 'B', 'C');
  31.         printf("再来一次?(y/s)");
  32.         ch=getchar();
  33.     } while (ch=='y'|| ch=='Y');
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 10:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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