C++太极门小弟子 发表于 2021-5-26 16:05:06

S1E13统计大写字母

#include <stdio.h>


int main() {
        int count = 0;
        char ch;
        printf("请输入一个英文句子:");
        ch = getchar();
        while (ch >= 'A' && ch <= 'Z' ) {
                count++;
        }
        printf("共有%d个大写字母", count);
        return 0;
}
不管我怎么输入都是输出0个{:10_262:} ,不知道怎么回事
下面是我的另一个想法:使用数组储存字符串然后遍历,但是大小写交错或者出现空格就错误了{:10_262:}
#include <stdio.h>


int main() {
        int count = 0;
        char ch;
        int i = 0;
        printf("请输入一个英文句子:");
        scanf("%s", ch);
        while (ch >= 'A' && ch <= 'Z' ) {
                count++;
                i++;
        }
        printf("共有%d个大写字母", count);
        return 0;
}

王之叹息 发表于 2021-5-26 18:07:23

嗯,先看第一个程序吧,getchar()。需要注意的是,getchar函数等待输入直到按回车键才结束,,回车键前所输入的全部字符都会在屏幕上显示,但是只有第一个字符作为函数的返回值。(一本学校教材上的原话)听懂吗?大白话就是在你的写的函数里ch的值只是你输入全部字符的第一个,然后一旦你输入第一个是大写字母,你仔细看,就会变成死循环了(还没在电脑实验,不过我说的这句应该没错)
第二个程序,我还有点事,一会儿再发

肖-肖 发表于 2021-5-26 18:21:49

本帖最后由 肖-肖 于 2021-5-26 18:33 编辑

直接说你改进的程序说起吧,先说下你的改进
1.改成了%s -->说明你认识到getchar()只能接收一个字符!
2.改成了数组-->说明你认识到要用数组来放字符串!
鹅 很棒,思路是对的,{:10_275:}就是一些小问题需要知道下就好了!
最大的问题是while循环ch >= 'A' && ch <= 'Z' 中的循环体--》i++放在了里边
这样写的话会导致当遇到小写字母的时候无法i++从而导致后边的字符无法正确(因为一致停留再那个小写字符上了嘛~)判断 对吧
还有个小问题是:scanf这个接收的话只能接收不带有空格的字符串,知道就OK了
所以我进行了改进
代码如下:
#include <stdio.h>


int main() {
      int count = 0;
      char ch;
      int i = 0;
      printf("请输入一个英文句子:");
      //scanf("%s", ch);

      while ((ch=getchar())!='\n') {
            //判断
            if(ch >= 'A' && ch <= 'Z' )
            {
                count++;
               
            }
             i++;
      }
      printf("共有%d个大写字母", count);
      return 0;
}

运行结果如下:

万千只cnm 发表于 2021-5-26 18:34:05

你只接受了一次getchar()要放循环里
#include <stdio.h>
int main() {
      int ch;
      int count= 0;
      while( (ch= getchar() ) != EOF ){
              if (ch>='A' && ch<= 'Z' )
              count++;
          }
          
          printf("%d\n",count);
          return 0;
}

第二种大写字母不是进入循环的条件   应在循环里用if判断    不然怎么遍历数组
#include <stdio.h>


int main() {
      int count = 0;
      char ch;
      int i = 0;
      printf("请输入一个英文句子:");
      gets(ch);
      while ( ch !='\0' ) {
              if(ch >= 'A' && ch <= 'Z' )
                count++;
                i++;
      }
      printf("共有%d个大写字母", count);
      return 0;
}

王之叹息 发表于 2021-5-26 18:57:11

好吧好吧,刚去吃个饭,结果被他们都快说完了,有什么不懂再问,本来想要最佳的{:10_266:}

万千只cnm 发表于 2021-5-26 19:16:28

王之叹息 发表于 2021-5-26 18:57
好吧好吧,刚去吃个饭,结果被他们都快说完了,有什么不懂再问,本来想要最佳的

{:5_105:}

最强废铁h 发表于 2021-5-26 19:19:57

王之叹息 发表于 2021-5-26 18:57
好吧好吧,刚去吃个饭,结果被他们都快说完了,有什么不懂再问,本来想要最佳的

下次建议饿着{:10_307:}

最强废铁h 发表于 2021-5-26 21:32:31

万千只cnm 发表于 2021-5-26 18:34
你只接受了一次getchar()要放循环里




你的第一个代码我怎么用不了

万千只cnm 发表于 2021-5-26 21:46:40

最强废铁h 发表于 2021-5-26 21:32
你的第一个代码我怎么用不了

咋用不了 编译不了吗

最强废铁h 发表于 2021-5-26 22:58:42

万千只cnm 发表于 2021-5-26 21:46
咋用不了 编译不了吗

https://z3.ax1x.com/2021/05/26/2CZEvQ.png

C++太极门小弟子 发表于 2021-5-26 23:05:33

王之叹息 发表于 2021-5-26 18:07
嗯,先看第一个程序吧,getchar()。需要注意的是,getchar函数等待输入直到按回车键才结束,,回车键前所 ...

意思是getchar()只能输出第一个字符吗{:10_272:}

C++太极门小弟子 发表于 2021-5-26 23:12:54

肖-肖 发表于 2021-5-26 18:21
直接说你改进的程序说起吧,先说下你的改进
1.改成了%s -->说明你认识到getchar()只能接收一个字符!
2.改 ...

{:10_262:}忘了,小写字母会跳出循环来着

C++太极门小弟子 发表于 2021-5-26 23:18:17

万千只cnm 发表于 2021-5-26 18:34
你只接受了一次getchar()要放循环里




把getchar()放进循环里的作用是每输入一个字符就执行一次循环吗

王之叹息 发表于 2021-5-26 23:34:34

C++太极门小弟子 发表于 2021-5-26 23:05
意思是getchar()只能输出第一个字符吗

getchar是用来输入一个字符的呀,只不过它的返回值是输入字符的整形阿斯克码

万千只cnm 发表于 2021-5-27 10:52:14

最强废铁h 发表于 2021-5-26 22:58


ctrl + z 结束EOF
或者改成 != '\n'   

肖-肖 发表于 2021-5-27 12:17:21

C++太极门小弟子 发表于 2021-5-26 23:12
忘了,小写字母会跳出循环来着

对吧 还是我解释的关键吧 哈哈 别人能要最佳我为什么不能 我也想要
页: [1]
查看完整版本: S1E13统计大写字母