C语言统计元音辅音函数中第二个j索引报错问题排查
错误原因分析与修复方案
核心报错原因:变量名重复定义导致类型混淆
你遇到的第二个循环报错,本质是同一作用域内同名变量重复定义:
- 函数开头声明了
int vowels = 0;,用来存储元音的统计数量 - 后续又声明了
char vowels[] = "aeiouAEIOU";,这会覆盖之前的int类型变量vowels。当第二个循环执行vowels[j]时,编译器认为vowels是int类型而非数组,自然无法用数组下标访问,触发expression must have pointer-to-object type, but it has type int错误。
附带的其他代码问题
除了核心报错,代码还有两处关键逻辑错误:
- 空输入判断错误:
if (src == "")是无效判断,""是字符串常量的指针,和输入指针src的地址永远不会相等。正确写法是检查指针是否为空src == NULL,或者检查字符串是否为空*src == '\0'。 - 结果赋值错误:
dstC = &cons;只是修改了函数内部的指针副本,不会改变main函数中传入的变量值。必须通过解引用指针,直接给目标内存赋值,比如*dstC = cons;。
修复后的完整代码
int count_vowels_consonants(unsigned char* src, int* dstV, int* dstC) { // 正确判断空指针或空字符串 if (src == NULL || *src == '\0') { return -1; } char consonants[] = "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"; // 重命名统计变量,避免和元音数组冲突 int vowel_count = 0; int consonant_count = 0; // 统计辅音,找到匹配后跳出内层循环优化性能 for (int i = 0; src[i] != 0; i++) { for (int j = 0; consonants[j] != 0; j++) { if (src[i] == consonants[j]) { consonant_count++; break; } } } // 给传入的目标变量赋值 *dstC = consonant_count; char vowels[] = "aeiouAEIOU"; // 统计元音 for (int i = 0; src[i] != 0; i++) { for (int j = 0; vowels[j] != 0; j++) { if (src[i] == vowels[j]) { vowel_count++; break; } } } *dstV = vowel_count; return 0; } int main(void) { char src[] = "ABACEDI0O1UR"; // 6 vowels, and 4 consonants int dstV = 0; int dstC = 0; int ret = count_vowels_consonants(src, &dstV, &dstC); return 0; }
修复说明
- 将统计元音的变量名改为
vowel_count,彻底避免和元音数组vowels的命名冲突,解决核心报错 - 修正空输入判断逻辑,确保边界情况处理正确
- 通过解引用指针赋值,让统计结果正确传递回
main函数 - 内层循环添加
break,减少不必要的循环次数,提升代码效率
内容的提问来源于stack exchange,提问作者Gabriel Burzacchini
相关产品推荐
相关产品推荐

