计算给定单词

时间:2017-03-24 10:45:25

标签: c string loops

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

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

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

Sample run #1:

I
1
went
1
apple
2
school
2
by
0
BUS
1
Exit
2

Sample run #2:

I go to school
1
1
1
2
by QQ email
0
0
3
Ai yAh Oooops
2
1
4
um
1
eXiT ignore these please
2

我正在编写此程序的代码并尝试使用此代码。它似乎提供了正确的输出,但仍然没有充分信任我的学校代码检查器。什么似乎是问题?

#include <stdio.h>
#include <string.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' || 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;
    }
}

2 个答案:

答案 0 :(得分:2)

有许多问题可以解释得分较低:

  • 您将自己限制为50个字符的行。学校的测试运行可能会有更长的线路,你可能会错误处理。规范说单词限制为50个字符,但行可能更长。您应该使用scanf()一次读取一个单词。
  • 你只要看到序列exit就退出程序,即使在一个单词的中间,这太强大而且不是必需的:你所说的要求是程序重复这个过程直到命中单词exit(不区分大小写)。在这种情况下,请在exit打印元音数后终止程序。
  • 您使用toupper(c),其中c的类型为char。如果c为否定,则可能存在未定义的行为。
  • 您将isVowel()中的字符大写,但仍将其与小写元音进行比较。
  • cchar *的名称选择不佳,更好地使用sstr

这是一个更简单的版本:

#include <ctype.h>
#include <stdio.h>

int isVowel(char c);
int isExit(const char *c);

int main(void) {
    char s1[51];
    int i, v;

    while (scanf("%50s", s1) == 1) {
        for (i = v = 0; s1[i] != '\0'; i++) {
            if (isVowel(s1[i])) {
                v++;
            }
        }
        printf("%d\n", v);
        if (isExit(s1))
            break;
    }
    return 0;
}

int isVowel(char c) {
    c = toupper((unsigned char)c);
    return (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U');
}

int isExit(const char *s) {
    return (toupper((unsigned char)s[0]) == 'E'
         && toupper((unsigned char)s[1]) == 'X'
         && toupper((unsigned char)s[2]) == 'I'
         && toupper((unsigned char)s[3]) == 'T'
         && s[4] == '\0');
}

答案 1 :(得分:0)

只是一个元音计数的演示。

$ ./a.out this is a demo string
[this]
{'a': 0, 'e': 0, 'i': 1, 'o': 0, 'u': 0, 'cnt': 1}
[is]
{'a': 0, 'e': 0, 'i': 1, 'o': 0, 'u': 0, 'cnt': 1}
[a]
{'a': 1, 'e': 0, 'i': 0, 'o': 0, 'u': 0, 'cnt': 1}
[demo]
{'a': 0, 'e': 1, 'i': 0, 'o': 1, 'u': 0, 'cnt': 2}
[string]
{'a': 0, 'e': 0, 'i': 1, 'o': 0, 'u': 0, 'cnt': 1}
// Count Vowels

// Enter a string and the program counts the number of vowels in the text.
// For added complexity have it report a sum of each vowel fount

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

typedef struct vowel_count
{
    int a;
    int e;
    int i;
    int o;
    int u;
} vowel_count_t;

bool
is_vowel(char ch)
{
    switch (ch)
    {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            return true;
        default:
            return false;
    }
}

vowel_count_t
count_vowel(char *str)
{
    int i, c;
    vowel_count_t vct;

    vct.a = 0;
    vct.e = 0;
    vct.i = 0;
    vct.o = 0;
    vct.u = 0;

    for (i = 0; i < strlen(str); i++)
    {
        c = tolower(str[i]);  // lower && upper
        if (c == 'a')
            vct.a++;
        else if (c == 'e')
            vct.e++;
        else if (c == 'i')
            vct.i++;
        else if (c == 'o')
            vct.o++;
        else if (c == 'u')
            vct.u++;
    }

    return vct;
}

void
print_vowel_cnt(char *str)
{
    int i, c = 0;
    vowel_count_t vct;

    // method 1
    vct = count_vowel(str);

    printf(
        "{'a': %d, 'e': %d, 'i': %d, 'o': %d, 'u': %d, 'cnt': %d}\n",
        vct.a, vct.e, vct.i, vct.o, vct.u,
        vct.a + vct.e + vct.i + vct.o + vct.u
    );

    // method 2
    // for (i = 0; i < strlen(str); i++)
    // {
    //     if (is_vowel(tolower(str[i])))
    //         c++;
    // }
    // printf("{'total': %d}\n", c);

}

int
main(int argc, char *argv[])
{
    int i;

    if (argc < 2)
    {
        printf("Usage: %s <str1> <str2> ...\n", argv[0]);
        return -1;
    }

    for (i = 1; i < argc; i++)
    {
        printf("[%s]\n", argv[i]);
        print_vowel_cnt(argv[i]);
    }

    return 0;
}