C语言字符串元音辅音分离程序计数器异常问题求助
问题根源分析与修复方案
核心问题1:值传递导致计数器修改无效
C语言函数参数默认是值传递——传递的是变量的副本,函数内部对参数的修改只会作用于这个副本,完全不会影响主函数里的原始变量。
以你的代码为例,调用checkcon(inp[i],con,conno)时,conno的当前值会被复制给函数内的counter参数。函数里执行counter = counter + 1,只是修改了这个局部副本,主函数中的conno根本不会变化,所以最终输出的辅音数量始终是初始值0。
而你看到的Con : 1重复出现,是因为每次调用checkcon时,传入的counter都是主函数里conno的初始值0,加1后变成1,但下次调用又会重新传入0,自然每次输出都是1。
核心问题2:未初始化变量产生垃圾值
代码中int vowno,conno = 0;这行只初始化了conno,vowno没有被赋值,它的值是内存中残留的随机垃圾数据。你看到的Vow : 15081和最终输出的15080,都是这个垃圾值加1后的结果,完全不可控。
额外问题:循环边界错误
主函数中的for (int i=0;i<=length;i++)存在逻辑问题:length是字符串的有效长度,字符索引范围是0 ~ length-1,i=length对应的是字符串结束符'\0',没必要处理这个字符,应改为i < length。
修复方案
方案1:使用指针传递计数器
通过指针让函数直接修改主函数中的变量:
修改checkcon和checkvow的参数与实现:
void checkcon(char letter, char string[], int *counter) { char consonants[] = "bcdfghjklmnpqrstvwxyz"; for (int i=0; i<strlen(consonants); i++) { if (letter == consonants[i]) { append(string, letter); (*counter)++; printf("Con : %d\n", *counter); } } } void checkvow(char letter, char string[], int *counter) { char vowels[] = "aeiou"; for (int i=0; i<strlen(vowels); i++) { if (letter == vowels[i]) { append(string, letter); (*counter)++; printf("Vow : %d\n", *counter); } } }
主函数中调用时传入变量地址,同时初始化两个计数器:
int vowno = 0, conno = 0; // ... for (int i=0; i<length; i++) { checkcon(inp[i], con, &conno); checkvow(inp[i], vow, &vowno); }
方案2:让函数返回更新后的计数器值
将函数改为int类型,返回修改后的计数器值:
修改函数实现:
int checkcon(char letter, char string[], int counter) { char consonants[] = "bcdfghjklmnpqrstvwxyz"; for (int i=0; i<strlen(consonants); i++) { if (letter == consonants[i]) { append(string, letter); counter++; printf("Con : %d\n", counter); } } return counter; } int checkvow(char letter, char string[], int counter) { char vowels[] = "aeiou"; for (int i=0; i<strlen(vowels); i++) { if (letter == vowels[i]) { append(string, letter); counter++; printf("Vow : %d\n", counter); } } return counter; }
主函数调用时接收返回值:
int vowno = 0, conno = 0; // ... for (int i=0; i<length; i++) { conno = checkcon(inp[i], con, conno); vowno = checkvow(inp[i], vow, vowno); }
优化建议
- 用
strlen()代替硬编码的字符数组长度,避免因字符修改导致的长度错误。 - 简化
append函数,直接操作字符串末尾比strcat更高效:
void append(char string[], char letter) { int len = strlen(string); string[len] = letter; string[len+1] = '\0'; }
内容的提问来源于stack exchange,提问作者nkminion
相关产品推荐
相关产品推荐

