鱼C论坛

 找回密码
 立即注册
查看: 2657|回复: 15

[已解决]S1E13统计大写字母

[复制链接]
发表于 2021-5-26 16:05:06 | 显示全部楼层 |阅读模式

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

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

x
#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个 ,不知道怎么回事
下面是我的另一个想法:使用数组储存字符串然后遍历,但是大小写交错或者出现空格就错误了
#include <stdio.h>


int main() {
        int count = 0;
        char ch[256];
        int i = 0;
        printf("请输入一个英文句子:");
        scanf("%s", ch);
        while (ch[i] >= 'A' && ch[i] <= 'Z' ) {
                count++;
                i++;
        }
        printf("共有%d个大写字母", count);
        return 0;
}
最佳答案
2021-5-26 18:21:49
本帖最后由 肖-肖 于 2021-5-26 18:33 编辑

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


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

        while ((ch[i]=getchar())!='\n') {
              //判断
              if(ch[i] >= 'A' && ch[i] <= 'Z' )
              {
                count++;
                
              }
             i++;
        }
        printf("共有%d个大写字母", count);
        return 0;
}
运行结果如下:
fa.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-26 18:07:23 | 显示全部楼层
嗯,先看第一个程序吧,getchar()。需要注意的是,getchar函数等待输入直到按回车键才结束,,回车键前所输入的全部字符都会在屏幕上显示,但是只有第一个字符作为函数的返回值。(一本学校教材上的原话)听懂吗?大白话就是在你的写的函数里ch的值只是你输入全部字符的第一个,然后一旦你输入第一个是大写字母,你仔细看,就会变成死循环了(还没在电脑实验,不过我说的这句应该没错)
第二个程序,我还有点事,一会儿再发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-26 18:21:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 肖-肖 于 2021-5-26 18:33 编辑

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


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

        while ((ch[i]=getchar())!='\n') {
              //判断
              if(ch[i] >= 'A' && ch[i] <= 'Z' )
              {
                count++;
                
              }
             i++;
        }
        printf("共有%d个大写字母", count);
        return 0;
}
运行结果如下:
fa.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[256];
        int i = 0;
        printf("请输入一个英文句子:");
        gets(ch); 
        while ( ch[i] !='\0' ) {
                if(ch[i] >= 'A' && ch[i] <= 'Z' )
                count++;
                i++;
        }
        printf("共有%d个大写字母", count);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-26 18:57:11 | 显示全部楼层
好吧好吧,刚去吃个饭,结果被他们都快说完了,有什么不懂再问,本来想要最佳的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

下次建议饿着
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-26 21:32:31 | 显示全部楼层
万千只cnm 发表于 2021-5-26 18:34
你只接受了一次getchar()  要放循环里

你的第一个代码我怎么用不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-26 21:46:40 | 显示全部楼层
最强废铁h 发表于 2021-5-26 21:32
你的第一个代码我怎么用不了

咋用不了 编译不了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-26 22:58:42 | 显示全部楼层
万千只cnm 发表于 2021-5-26 21:46
咋用不了 编译不了吗


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

意思是getchar()只能输出第一个字符吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

忘了,小写字母会跳出循环来着
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-26 23:18:17 | 显示全部楼层
万千只cnm 发表于 2021-5-26 18:34
你只接受了一次getchar()  要放循环里

把getchar()放进循环里的作用是每输入一个字符就执行一次循环吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-26 23:34:34 From FishC Mobile | 显示全部楼层
C++太极门小弟子 发表于 2021-5-26 23:05
意思是getchar()只能输出第一个字符吗

getchar是用来输入一个字符的呀,只不过它的返回值是输入字符的整形阿斯克码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-27 10:52:14 | 显示全部楼层

ctrl + z 结束EOF  
或者改成 != '\n'   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-27 12:17:21 | 显示全部楼层
C++太极门小弟子 发表于 2021-5-26 23:12
忘了,小写字母会跳出循环来着

对吧 还是我解释的关键吧 哈哈 别人能要最佳我为什么不能 我也想要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 14:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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