| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4662 人关注过本帖
标题:统计每个元音字母出现的次数,遇到诡异的事情
只看楼主 加入收藏
洛秋
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2018-1-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:12 
统计每个元音字母出现的次数,遇到诡异的事情
统计每个元音字母在字符串中出现的次数。
Input
输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串。
Output
对于每个测试实例输出5行,格式如下:
a:num1
e:num2
i:num3
o:num4
u:num5
多个测试实例之间由一个空行隔开。

请特别注意:最后一块输出后面没有空行:)
Sample Input
2
aeiou
my name is ignatius
Sample Output
a:1
e:1
i:1
o:1
u:1

a:2
e:1
i:3
o:0
u:1

我的代码

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main()
{
    int n,j,k,a,e,i,o,u,count;
    char s[1000];
    while(scanf("%d",&n)!=EOF)
    {
        getchar();
        gets(s);
        count=0;
        a=0;
        e=0;
        i=0;
        o=0;
        u=0;
        k=strlen(s);
        //printf("%d",k);
        for(j=0; j<k; j++)
        {
            if(s[j]=='a')
                printf("123123");
                a++;
            if(s[j]=='e')
                e++;
            if(s[j]=='i')
                i++;
            if(s[j]=='o')
                o++;
            if(s[j]=='u')
                u++;
        }
        printf("a:%d\n",a);
        printf("e:%d\n",e);
        printf("i:%d\n",i);
        printf("o:%d\n",o);
        printf("u:%d\n",u);
        /*count++;
        printf("%d\n",count);
        if(count!=n)
            printf("\n");*/为了满足这该死的输出格式,最后一行没有空行
    }
    return 0;
}

结果
图片附件: 游客没有浏览图片的权限,请 登录注册
这是为什么,每个不都设的一样嘛。。
搜索更多相关主题的帖子: 统计 字母 include count printf 
2018-01-30 23:07
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10541
专家分:42927
注 册:2014-5-20
收藏
得分:3 
#include<stdio.h>
int main()
{
    int n,j,a,e,i,o,u;
    char s[1000];
    scanf("%d",&n);
    while (getchar()!='\n');
    while(n--)
    {
        gets(s);
        a=0;
        e=0;
        i=0;
        o=0;
        u=0;
        for(j=0; s[j]; j++)
        {
            if(s[j]=='a')
                a++;
            else if(s[j]=='e')
                e++;
            else if(s[j]=='i')
                i++;
            else if(s[j]=='o')
                o++;
            else if(s[j]=='u')
                u++;
        }
        printf("a:%d\n",a);
        printf("e:%d\n",e);
        printf("i:%d\n",i);
        printf("o:%d\n",o);
        printf("u:%d\n",u);
        if (n>0)
          printf("\n");
    }
    return 0;
}

[此贴子已经被作者于2018-1-31 05:28编辑过]

2018-01-31 05:19
洛秋
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2018-1-27
收藏
得分:0 
回复 2楼 吹水佬
这个跟我写的有什么区别吗,还有为什么我的代码会出现那种情况
2018-01-31 22:40
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:3 
区别是有的,你可以仔细比对一下。
printf("123123"); 这个应该是你调试的用的,撇过不提。



123123a:5   输出这个前面的 123123可以理解,  a:5   这里表示a有5个(理想应该是1) 原因:
if(s[j]=='a')
    printf("123123");
    a++;                //if没有加大括号, 该判断只对接下去一句代码有效, 即使a++缩进了(a++不受if(s[j]=='a')的制约) ,故 for(j=0; s[j]; j++)每进行一次循环a自加一次。



到第二个 a:4与上面 a:5不一样,  原因:
 while(scanf("%d",&n)!=EOF)
 {
    getchar();
    gets(s);             //在第一次aeiou输入后, 执行gets(s)后 该函数会"吃掉"回车,  故当第二次输入字符串aeiou后,首先执行getchar()函数,此函数"吃掉"a ,  然后字符串eiou进入for(j=0; s[j]; j++)循环
 

 a:4  a为什么是4  见上一条原因

[此贴子已经被作者于2018-1-31 23:08编辑过]


早知做人那么辛苦!  当初不应该下凡
2018-01-31 23:06
洛秋
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2018-1-27
收藏
得分:0 
回复 4楼 炎天
谢谢你,明白了!
2018-01-31 23:45
洛秋
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2018-1-27
收藏
得分:0 
回复 4楼 炎天
那如果我想消除回车,但不想第二次消除a,就是实现题目我该怎么做,这个getchar()不是必须要加的吗
2018-01-31 23:47
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:3 
主要是消掉scanf("%d",&n); 这里的回车。

城如2楼吹老师所写,
scanf("%d",&n);
while (getchar()!='\n');
收到的鲜花
  • 书生牛犊2018-02-01 00:56 送鲜花  10朵   附言:哈哈,这么晚还不睡。

早知做人那么辛苦!  当初不应该下凡
2018-02-01 00:51
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:3 
回复 6楼 洛秋
用getchar()  主要是因为前面的scanf(%d)是读完数字它就自动返回了,回车换行符还留在缓存器里。这时候如果直接gets()就会读到一个单纯的“\n”,自动转换为空字符串。

gets()函数有个特点就是他读一个字符串,他会把'\n',一起读入,只是在写字符串的时候又会用'\0'代替掉'\n'.这时候缓存器里就没有'\n'而直接是下一行的内容了。

所以我们可以看到二楼@吹水佬 所给的代码,在while循环里并没有再用getchar();         至于他写的while(getchar()!='\n');理论上循环只执行一次就跳出了,因为缓存器里的第一个字符就是'\n'。
收到的鲜花
  • 炎天2018-02-01 01:19 送鲜花  10朵   附言:每天都挺晚的, 好久没发言了,冒个泡 嘿嘿

φ(゜▽゜*)♪
2018-02-01 00:55
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10541
专家分:42927
注 册:2014-5-20
收藏
得分:3 
以下是引用书生牛犊在2018-2-1 00:55:17的发言:
所以我们可以看到二楼@吹水佬 所给的代码,在while循环里并没有再用getchar();         至于他写的while(getchar()!='\n');理论上循环只执行一次就跳出了,因为缓存器里的第一个字符就是'\n'。

用while(getchar()!='\n');是惯用写法,不管输入缓冲有多少输入的数据都“清除”,这样做可以防一些误操作输入的数据。如执行 scanf("%d",&n) 时,误输入“123 ”多输入了一个空格,除了123被读出到变量n外,之后的都保存在输入缓冲。
2018-02-01 06:14
洛秋
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2018-1-27
收藏
得分:0 
回复 9楼 吹水佬
有点懵,getchar是从缓冲区读取字符吗,但是题目要求多组输入就是n要能输入很多次
图片附件: 游客没有浏览图片的权限,请 登录注册
我这么改为什么不对啊。。
2018-02-01 12:28
快速回复:统计每个元音字母出现的次数,遇到诡异的事情
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019954 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved