C语言嵌套循环判断二维数组字符串首字母为辅音 运行异常求助
代码问题排查与修复方案
你的代码存在以下几处核心错误,是导致运行结果不符合预期的直接原因:
- 笔误错误:代码中存在
iif关键字,应为if,该问题会直接导致编译失败。 - 辅音判断逻辑错误:你使用了
||(逻辑或)连接非元音判断条件,该条件永远为真(任意字符不可能同时等于所有元音字母,必然满足“不是某一个元音”的或条件),所以所有单词都会进入辅音分支,才会输出大量a。需要将||替换为&&(逻辑与),同时调整空值判断的位置。 - 循环控制错误:你在循环内部手动执行
i++,而外层for循环本身会自动对i自增,双重自增会导致跳过后续单词,也会引发数组越界访问未初始化的内存空间。 - 数组未初始化:
inputArray未做初始化,未使用的数组位置存储的是随机垃圾值,你判断inputArray[i][0] == '\0'结束循环的逻辑会失效,导致循环执行满99次。 - 换行符处理缺失:
fgets读取输入时会将末尾的换行符\n一并存入字符串,拆分单词时会被计入最后一个单词的内容。
修正后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char inputString[999]; char inputArray[99][99] = {0}; // 初始化数组全为0 int a = 0; int b = 0; fgets(inputString, sizeof inputString, stdin); // 去除fgets读入的末尾换行符 inputString[strcspn(inputString, "\n")] = '\0'; // 拆分单词到二维数组 for(int i = 0; i <= strlen(inputString); i++) { if(inputString[i] == ' ' || inputString[i] == '\0') { inputArray[a][b] = '\0'; a++; b = 0; } else { inputArray[a][b] = inputString[i]; b++; } } // 处理每个单词 for (int i = 0; i < 99; i++) { if (inputArray[i][0] == '\0') { break; } char first = inputArray[i][0]; // 判断首字母是否为元音 int is_vowel = (first == 'a' || first == 'e' || first == 'i' || first == 'o' || first == 'u' || first == 'A' || first == 'E' || first == 'I' || first == 'O' || first == 'U'); if (is_vowel) { int len = strlen(inputArray[i]); int insert_pos = len; // 查找标点位置,把moo插在标点前面 for (int j = 0; j < len; j++) { if (inputArray[i][j] == '.' || inputArray[i][j] == ',') { insert_pos = j; break; } } // 后移标点和结束符,插入moo for (int j = len; j >= insert_pos; j--) { inputArray[i][j + 3] = inputArray[i][j]; } inputArray[i][insert_pos] = 'm'; inputArray[i][insert_pos + 1] = 'o'; inputArray[i][insert_pos + 2] = 'o'; } else { // 辅音分支,你的测试输出a可以放在这 // printf("a"); } } // 输出结果 for (int i = 0; i < 99; i++) { if (inputArray[i][0] == '\0') { break; } printf("%s ", inputArray[i]); } return 0; }
测试验证
输入yo时,首字母y为辅音,不会进入元音处理逻辑,也不会重复输出大量a,符合预期。
输入apple, orange. test时,输出为applemoo, orangemoo. test ,符合需求要求。
内容的提问来源于stack exchange,提问作者Excal
相关产品推荐
相关产品推荐

