计算单词中的元音数量 请编写一个程序来计算输入单词列表中的元音数量('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;
}
}
答案 0 :(得分:2)
有许多问题可以解释得分较低:
scanf()
一次读取一个单词。exit
就退出程序,即使在一个单词的中间,这太强大而且不是必需的:你所说的要求是程序重复这个过程直到命中单词exit
(不区分大小写)。在这种情况下,请在exit
打印元音数后终止程序。 toupper(c)
,其中c
的类型为char
。如果c
为否定,则可能存在未定义的行为。isVowel()
中的字符大写,但仍将其与小写元音进行比较。c
是char *
的名称选择不佳,更好地使用s
或str
。这是一个更简单的版本:
#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;
}