这个C程序有什么问题来计算每个元音的出现次数?

问题:

编写一个C程序,提示用户输入由ENTER键终止的字符串(即’\ n’),然后计算字符串中每个元音的出现总数。 您的程序应使用以下准则:
•您的程序应声明一个包含5个整数计数器的数组,即计数器。
•使用循环,程序应将数组的每个成员初始化为0。
•然后检查字符串中的每个字符以查看它是否是元音,即“a”,“e”,“i”,“o”或“u”。 在这种情况下,相应的计数器递增。 例如,如果读取’a’,则计数器[0]递增,如果读取’i’则递增计数器[2],依此类推。
•输入的字符可以是小写或大写。
•您的程序应使用循环打印出5个计数器的内容。
•最后,您的程序应该打印字符串中的元音总数。
结果应如下所示:请输入由ENTER键终止的字符串:

“棕色的狐狸跳过懒狗”

counter[0] = 1 counter[1] = 4 counter[2] = 0 counter[3] = 4 counter[4] = 1 

元音总数= 10

我的代码:

 #include  main(){ int counter[5]; int c, i; for(i = 0; i < 5; i++) counter[i] = 0; printf("Please enter a string terminated by ENTER key:\n"); while((c = getchar()) != '\n') { if((counter[i] == 'a' || counter[i] == 'e' || counter[i] == 'i' || counter[i] == 'o' || counter[i] == 'u') ||(counter[i] == 'A' || counter[i] == 'E' || counter[i] == 'I' || counter[i] == 'O' || counter[i] == 'U')) { for(i = 0; i < 5; i++) { if(c == 'a' + i) counter[i] = counter[i] + 1; } } } for(i = 0; i < 5; i++) printf("counter[%d] = %d\n", i, counter[i]); } 

我的柜台有什么问题? 提前致谢。

首先,你应该为main:int(ex:int main())设置返回类型,这不会破坏你的代码,而是C标准,并从编译器发出警告。

C中的字符取ASCII编码标准中的数值: http : //upload.wikimedia.org/wikipedia/commons/1/1b/ASCII-Table-wide.svg ,查看那里的值(’a’是97例如),更多关于维基百科: http : //en.wikipedia.org/wiki/ASCII

你在最后一个for循环中所做的只是将字符与a,b,c,d,e进行比较。

我建议你做的是为角色切换:

 switch(c) { case 'a': case 'A': counter[0]++; break; case 'e': case 'E': counter[1]++; break; case 'i': case 'I': counter[2]++; break; case 'o': case 'O': counter[3]++; break; case 'u': case 'U': counter[4]++; break; } 

或者,您可以制作五个if语句。

它现在应该工作正常。

(只是为了好玩,我的回答)

 int main(void) { int counter[5] = {0}; int *i, c; printf("Please enter a string terminated by ENTER key:\n"); while(i = counter, (c = getchar()) != '\n') { switch(c) { default: continue; case 'U'+' ': case 'U': ++ i; case 'O'+' ': case 'O': ++ i; case 'I'+' ': case 'I': ++ i; case 'E'+' ': case 'E': ++ i; case 'A'+' ': case 'A': ++*i; } } for(c = 0; c < 5; printf("counter[%d] = %d\n", c, counter[c++])); return 0; } 

我想这就是你要做的事情:

 printf("Please enter a string terminated by ENTER key:\n"); while((c = getchar()) != '\n') { if (c=='a' || c=='A') counter[0]++; else if (c=='e' || c=='E') counter[1]++; else if (c=='i' || c=='I') counter[2]++; else if (c=='o' || c=='O') counter[3]++; else if (c=='u' || c=='U') counter[4]++; } for(i = 0; i < 5; i++) printf("counter[%d] = %d\n", i, counter[i]); 

使用开关:

 printf("Please enter a string terminated by ENTER key:\n"); while((c = getchar()) != '\n') { switch(c) { case 'a': case 'A': counter[0]++; break; case 'e': case 'E': counter[1]++; break; case 'i': case 'I': counter[2]++; break; case 'o': case 'O': counter[3]++; break; case 'u': case 'U': counter[4]++; break; default: break; } } for(i = 0; i < 5; i++) printf("counter[%d] = %d\n", i, counter[i]); 

while((c = getchar()) != '\n') { if((counter[i] == 'a' || counter[i] == 'e' || counter[i] == 'i' || counter[i] == 'o' || counter[i] == 'u') ||(counter[i] == 'A' || counter[i] == 'E' || counter[i] == 'I' || counter[i] == 'O' || counter[i] == 'U')) { for(i = 0; i < 5; i++) { if(c == 'a' + i) counter[i] = counter[i] + 1; } } }

我觉得这段代码中的逻辑可能是错误的,因为你已经用0初始化你的计数器[0]然后你将它与'a'或'A'进行比较而不是char c,所以使用

while((c = getchar()) != '\n') { if(c == 'a' || c == 'A') { i = 0; counter[i] =+ 1; } else if( c == 'i' || c == 'I' ) { i = 1; counter[i] =+ 1; } ...//and so on
}

到目前为止,其他任何回答者都没有注意到这些改进代码的可能性:

  • 将元音定义为字符串并编写一个函数,该函数返回该字符串中元音的索引(如果不是元音错误,则返回-1)。
  • 在进行比较之前将字符转换为小写。 这是实现不区分大小写行为的一种非常常见的方法。
  • 您还应该检查EOF作为循环的退出条件。

我想,你需要的是这样的:

 #include  #include  const char vowels[] = "aeiou"; int findvowel(char c) { int i; c = tolower(c); for (i=0; vowels[i]; i++) if (vowels[i] == c) return i; return -1; } int main() { char c; int i, sum; int counter[sizeof(vowels)] = {0}; while (c=getchar(), c != EOF && c != '\n') { i = findvowel(c); if (i != -1) counter[i] += 1; } printf("having found these vowels:\n"); for (i=0, sum=0; vowels[i]; i++) { printf("'%c': %d\n", vowels[i], counter[i]); sum += counter[i]; } printf("total: %d %s\n", sum, sum != 1 ? "vowels" : "vowel"); return 0; }