C程序计算输入单词列表中的元音数量

时间:2017-03-22 08:54:37

标签: c string loops character

我需要编写一个程序来计算输入单词列表中有多少元音('a','e','i','o','u')。我的程序逐个读取单词并打印每个单词中出现的元音数量。每个单词仅包含混合大小写的字母。该程序重复此过程,直到单击“退出”(不区分大小写)。在这种情况下,在“退出”中打印元音数后终止程序。终止后,程序应忽略剩余的输入(如果有的话)。

输入:跨越行的多个单词。 每个单词不得超过50个字符。 单词用空格分隔。

输出:每个输入字中的元音数,由换行符分隔。 也就是说,一行上有一个数字。

预期输入输出示例

输入:

我去BUS上学

退出

输出:

1

1

1

2

0

1

2

另一个输入:

苹果

通过

BUS

退出

输出:

1

1

2

2

0

1

2

我遇到问题"时间限制超过"我很感激对我的计划的任何反馈

当我输入时:

我去BUS上学

我收到通知时间限制超出和输出:

1

1

1

2

0

1

#include <stdio.h>
#include <string.h>

int main(void)
{
char s1[51], ex[5];
int N, i, v, newline=1;
while(newline){
fgets( s1, 51, stdin);
if((s1[0]=='e' || s1[0]=='E')&&(s1[1]=='x' || s1[1]=='X')&&(s1[2]=='i' ||       s1[2]=='I')&&(s1[3]=='t' || s1[3]=='T')&&(s1[4]=='\0' || s1[4]==' ')){
    printf("2\n"); // to check whether the input is Exit
    newline=0;
}
else{
    N=strlen(s1);
    for(i=0;i<N;i++){
        if(s1[i]=='a' || s1[i]=='o' || s1[i]=='e' || s1[i]=='i' || s1[i]=='u' || s1[i]=='A' || s1[i]=='O' || s1[i]=='E' || s1[i]=='I' || s1[i]=='U'){
            v++; // to calculate the number of vowels
                 }
         if(s1[i+1]==' '){ // if next entry is spacebar, print the number of vowels in the current word and add i so that next loop will start on new word
            printf("%d\n", v);
            v=0;
            i++;
        }
        else if(s1[i+1]=='\n'){ // if next entry is new line, print the number of vowels in the current word, restart the whole program by exiting the for loop 
            printf("%d\n", v);
            v=0;
            newline=1;
            break;
        }

        }

        }
    }


return 0;

}

2 个答案:

答案 0 :(得分:1)

你应该回顾一些事情:

  1. 比较char时,不区分大小写,很容易做到:

    char c1, c2; if ( toupper(c1) == toupper(c1) ) { do_something(); }

  2. 要退出循环,我会使用break;代替return;

  3. 整个代码就是这样:

    #include <stdio.h>
    #include <ctype.h>
    
    int isVowel(char c);
    int isExit(char* c);
    
    int main(void)
    {
        char s1[51];
        int N, i, v = 0;
        int noExit = 1;
    
        while( noExit ){
            fgets( s1, 51, stdin);
            N=strlen(s1);
    
            for(i=0;i<N;i++) {
                if ( isExit(&s1[i]) ) {
                     printf("2\n");
                     noExit = 0;
                     break;
                }
                else{
                    if( isVowel(s1[i]) ) {
                        v++;
                    }
                    else if( s1[i]==' ' || s1[i]=='\n' ) {
                        printf("%d\n", v);
                        v=0;
                    }
                }
            }
        }
        return 0;
    }
    
    int isVowel(char c) {
        c = toupper(c);
        if( c=='A' || c=='E' || c=='I' || c=='O' || c=='U' )
            return 1;
        else
            return 0;
    }
    
    int isExit(char* c) {
        if ( (toupper(c[0]) == 'E') && (toupper(c[1]) == 'X') &&
             (toupper(c[2]) == 'I') && (toupper(c[3]) == 'T')    ) {
            return 1;
        }
        else {
            return 0;
        }
    }
    

答案 1 :(得分:0)

你有一个无限循环。 newline永远不会是0.而外部的while循环永远不会退出。

因此,您需要将最后一个if条件中的newline=1更改为newline=0

此外,变量v未初始化,因此您无法正确获得第一个答案。您应该在while循环开始之前设置v=0