C语言统计元音数字代码执行strcmp时异常终止是什么原因?
问题原因
- 核心错误是
strcmp函数的传参类型不匹配:strcmp要求传入两个以'\0'结尾的C字符串首地址(char*类型),你传入的str[i]和tester[j]都是单个char类型的字符,程序会把字符的ASCII值当做内存地址去访问,属于非法内存访问,直接触发崩溃。 - 次要问题:你定义的
tester数组长度为11,但仅初始化了10个元音字符,剩下的1个元素值是随机的,循环j < 11时会读取到无效值。 - 隐含依赖问题:
isdigit、isalpha函数来自<ctype.h>头文件,如果编译有警告可以补充引入,不会影响你仅修改processString的要求。
修复后的processString函数代码
void processString(char *str, int *totVowels, int *totDigits) { int i, j; // 调整数组长度为10,匹配元音字符总数 char tester[10] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}; *totDigits = 0; *totVowels = 0; for (i = 0; i < strlen(str); i++) { if (isdigit(str[i])) { *totDigits += 1; } else if(isalpha(str[i])) { for (j = 0; j < 10; j++) { // 单个字符直接用==比较即可,不要用strcmp if (str[i] == tester[j]) { *totVowels+=1; // 匹配到就可以跳出内层循环,不需要继续遍历 break; } } } } }
内容的提问来源于stack exchange,提问作者Tajoh Programmer
相关产品推荐
相关产品推荐

