C语言元音统计函数异常:统计结果与实际不符问题排查
问题分析与解决方案
问题根因
你的代码强制遍历数组全部64个元素,但输入的字符串是以'\0'作为结束标记的,数组中超出字符串长度的位置都是未初始化的垃圾数据。这些垃圾值经过toupper()转换后,有可能恰好等于元音字符(比如某个垃圾字节的值对应'A'),导致额外统计了一个元音。这就是为什么元音数量≤9时会多1个——刚好有一个垃圾值被误判,而≥9时只是巧合没碰到这种情况。
修复方案
修改循环条件,只遍历到字符串的结束符'\0'就停止,而非固定遍历64次。C语言中字符串的有效内容永远在'\0'之前,这是字符串遍历的标准逻辑。
修正后的代码
#include<stdio.h> #include<ctype.h> int vowelcounter(char word[]) { int count = 0; // 修改循环条件:遍历到字符串结束符即停止 for (int i=0; word[i] != '\0'; i++) { // 用临时变量存储转换后的值,避免修改原数组内容 char upper_char = toupper(word[i]); if (upper_char == 'A' || upper_char == 'E' || upper_char == 'I' || upper_char == 'O' || upper_char == 'U') { count++; } } return count; } int main() { char word[64]; scanf(" %s", word); printf("Number of vowels is %i\n", vowelcounter(word)); return 0; }
额外优化思路
- 避免直接修改传入的
word数组,用临时变量存储toupper()结果,防止破坏原字符串内容。 - 也可以用
while循环实现,逻辑更直观:int vowelcounter(char word[]) { int count = 0; int i = 0; while (word[i] != '\0') { char c = toupper(word[i]); if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') { count++; } i++; } return count; }
内容的提问来源于stack exchange,提问作者Idiot1234
相关产品推荐
相关产品推荐

