鱼C论坛

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

[已解决]我有问题吗?#C

[复制链接]
发表于 2023-10-7 09:52:37 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int num1,num2,num3,num4,num5;
  5.         char ch;
  6.         printf("请输入一个英文句子:");
  7.         while(ch = getchar() != '\n')
  8.         {
  9.                 switch(ch)
  10.                 {
  11.                         case 'a':num1 = num1 + 1;break;
  12.                         case 'A':num1 = num1 + 1;break;
  13.                         case 'e':num2 = num2 + 1;break;
  14.                         case 'E':num2 = num2 + 1;break;
  15.                         case 'i':num3 = num3 + 1;break;
  16.                         case 'I':num3 = num3 + 1;break;
  17.                         case 'o':num4 = num4 + 1;break;
  18.                         case 'O':num4 = num4 + 1;break;
  19.                         case 'u':num5 = num5 + 1;break;
  20.                         case 'U':num5 = num5 + 1;break;
  21.                 }
  22.         }
  23.         printf("您输入的句子中共有元音字母%d个\n",num1+num2+num3+num4+num5);
  24.         printf("你输入的句子中:a(%d),e(%d),i(%d),o(%d),u(%d)\n",num1,num2,num3,num4,num5);
  25.         return 0;
  26. }
复制代码




运行如下,为什么只检索到了一个e???
  1. 请输入一个英文句子:I love FishC.com
  2. 您输入的句子中共有元音字母1个
  3. 你输入的句子中:a(0),e(1),i(0),o(0),u(0)
复制代码


最佳答案
2023-10-7 09:52:55
问题出在这一行代码上:

  1. while(ch = getchar() != '\n')
复制代码


这是因为  !=  运算符的优先级高于赋值运算符  = ,所以  ch  的值被赋为  getchar() != '\n'  的结果,而不是  getchar()  的返回值。

解决这个问题的方法是使用括号明确指定赋值运算符的优先级,将代码修改为:

  1. while((ch = getchar()) != '\n')
复制代码


这样就能正确地将  getchar()  的返回值赋给  ch ,并进行后续的判断和处理。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-7 09:52:55 | 显示全部楼层    本楼为最佳答案   
问题出在这一行代码上:

  1. while(ch = getchar() != '\n')
复制代码


这是因为  !=  运算符的优先级高于赋值运算符  = ,所以  ch  的值被赋为  getchar() != '\n'  的结果,而不是  getchar()  的返回值。

解决这个问题的方法是使用括号明确指定赋值运算符的优先级,将代码修改为:

  1. while((ch = getchar()) != '\n')
复制代码


这样就能正确地将  getchar()  的返回值赋给  ch ,并进行后续的判断和处理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-7 09:53:28 | 显示全部楼层
问题分析:

在这段代码中,出现了逻辑错误。错误出现在以下代码行:
  1. while (ch = getchar() != '\n')
复制代码

该行代码的逻辑是想要循环读取输入的英文句子,直到遇到换行符为止。但是这里的逻辑有一个问题:由于运算符优先级的关系,!= 的优先级高于 =,所以实际上该行代码等价于:
  1. while (ch = (getchar() != '\n'))
复制代码

这样的写法会导致 ch 永远被赋值为 01,而不是输入的字符。

问题解决:

为了修正该问题,我们需要使用括号来明确赋值和比较的优先级。将代码修改如下:
  1. while ((ch = getchar()) != '\n')
复制代码

经过以上修改,代码应该能够正确统计输入句子中的元音字母数量。

完整修改后的代码如下:
  1. #include <stdio.h>
  2. int main() {
  3.     int num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0;
  4.     char ch;
  5.     printf("请输入一个英文句子:");
  6.     while ((ch = getchar()) != '\n') {
  7.         switch(ch) {
  8.             case 'a':
  9.             case 'A':
  10.                 num1++;
  11.                 break;
  12.             case 'e':
  13.             case 'E':
  14.                 num2++;
  15.                 break;
  16.             case 'i':
  17.             case 'I':
  18.                 num3++;
  19.                 break;
  20.             case 'o':
  21.             case 'O':
  22.                 num4++;
  23.                 break;
  24.             case 'u':
  25.             case 'U':
  26.                 num5++;
  27.                 break;
  28.         }
  29.     }
  30.     printf("您输入的句子中共有元音字母%d个\n", num1 + num2 + num3 + num4 + num5);
  31.     printf("你输入的句子中:a(%d),e(%d),i(%d),o(%d),u(%d)\n", num1, num2, num3, num4, num5);
  32.     return 0;
  33. }
复制代码

希望能够解决你的问题!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 15:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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