鱼C论坛

 找回密码
 立即注册
查看: 1384|回复: 5

[已解决]c语言中关于for语句的一些禁忌

[复制链接]
发表于 2021-7-14 16:44:10 | 显示全部楼层 |阅读模式

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

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

x
我发现for语句与while dowhile他们之间确实不是一个简单一个不简单的区别,今天做作业时,做了一个统计一句话中元音字母个数的程序
我是这么写的
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int a = 0,e = 0,i = 0,o = 0,u = 0,ch,sum;
  5.        
  6.         printf("请输入一个英文句子:");
  7.        
  8.         for (ch = getchar();ch != '\n';)
  9.         {       
  10.                 switch(ch)
  11.                 {
  12.                         case 'A':a++;break;
  13.                         case 'a':a++;break;
  14.                         case 'E':e++;break;
  15.                         case 'e':e++;break;
  16.                         case 'I':i++;break;
  17.                         case 'i':i++;break;
  18.                         case 'O':o++;break;
  19.                         case 'o':o++;break;
  20.                         case 'U':u++;break;
  21.                         case 'u':u++;break;
  22.                 }       
  23.         }
  24.        
  25.         sum = a + e + i + o + u;
  26.        
  27.         printf("您输入的句子中,包含元音字母%d个\n\
  28. 其中:a(%d),e(%d),i(%d),o(%d),u(%d)\n",sum,a,e,i,o,u);
  29.        
  30.         return 0;
  31. }
复制代码

小甲鱼是这么写的
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char ch;
  5.         int a, e, i, o, u;

  6.         a = 0;
  7.         e = 0;
  8.         i = 0;
  9.         o = 0;
  10.         u = 0;

  11.         printf("请输入一个英文句子:");

  12.         while ((ch = getchar()) != '\n')
  13.         {
  14.                 switch (ch)
  15.                 {
  16.                         case 'a':
  17.                         case 'A': a++;
  18.                                   break;
  19.                         case 'e':
  20.                         case 'E': e++;
  21.                                   break;
  22.                         case 'i':
  23.                         case 'I': i++;
  24.                                   break;
  25.                         case 'o':
  26.                         case 'O': o++;
  27.                                   break;
  28.                         case 'u':
  29.                         case 'U': u++;
  30.                                   break;
  31.                 }
  32.         }

  33.         printf("您输入的句子中,包含元音字母%d个!\n", a + e + i + o + u);
  34.         printf("其中:a(%d),e(%d),i(%d),o(%d),u(%d)\n", a, e, i, o, u);

  35.         return 0;
  36. }
复制代码

我的程序在编译后,输入完句子后按下回车就不再反应了,而只需要把for那句改成while就没问题了,这是为什么呢?求大佬解答,也希望大佬可以分享一下自己在敲代码时,关于for与while有什么要注意的呢?
最佳答案
2021-7-14 16:51:06
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int a = 0,e = 0,i = 0,o = 0,u = 0,ch,sum;

  5.     printf("请输入一个英文句子:");

  6.     //for (ch = getchar();ch != '\n';)
  7.     for (ch = getchar();ch != '\n';ch = getchar())
  8.     {        
  9.         switch(ch)
  10.         {
  11.             case 'A':a++;break;
  12.             case 'a':a++;break;
  13.             case 'E':e++;break;
  14.             case 'e':e++;break;
  15.             case 'I':i++;break;
  16.             case 'i':i++;break;
  17.             case 'O':o++;break;
  18.             case 'o':o++;break;
  19.             case 'U':u++;break;
  20.             case 'u':u++;break;
  21.         }        
  22.     }

  23.     sum = a + e + i + o + u;

  24.     printf("您输入的句子中,包含元音字母%d个\n\
  25.             其中:a(%d),e(%d),i(%d),o(%d),u(%d)\n",sum,a,e,i,o,u);
  26.     return 0;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-14 16:51:06 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int a = 0,e = 0,i = 0,o = 0,u = 0,ch,sum;

  5.     printf("请输入一个英文句子:");

  6.     //for (ch = getchar();ch != '\n';)
  7.     for (ch = getchar();ch != '\n';ch = getchar())
  8.     {        
  9.         switch(ch)
  10.         {
  11.             case 'A':a++;break;
  12.             case 'a':a++;break;
  13.             case 'E':e++;break;
  14.             case 'e':e++;break;
  15.             case 'I':i++;break;
  16.             case 'i':i++;break;
  17.             case 'O':o++;break;
  18.             case 'o':o++;break;
  19.             case 'U':u++;break;
  20.             case 'u':u++;break;
  21.         }        
  22.     }

  23.     sum = a + e + i + o + u;

  24.     printf("您输入的句子中,包含元音字母%d个\n\
  25.             其中:a(%d),e(%d),i(%d),o(%d),u(%d)\n",sum,a,e,i,o,u);
  26.     return 0;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-14 17:19:42 | 显示全部楼层
把那个 for 循环改成这样:
  1. for (;ch != '\n';ch = getchar())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-14 17:20:58 | 显示全部楼层

谢谢,不过请问这是为什么呢,为什么循环调整表达式也要写ch = getchar()呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-14 19:03:02 | 显示全部楼层
for有三个空呀 中间那个是判断是否进行循环的。
while 只有一个空进行判断
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-14 19:04:24 | 显示全部楼层
  1. for (ch = getchar();ch != '\n';)
复制代码

你这样相当于 第一个空ch = getchar() 只执行了一次  
最后一个空省略了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 06:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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