C语言去除元音程序处理含空格字符串失效,如何解决?
问题分析与解决
核心问题:输入读取不完整
你代码里用scanf("%s", array)读取输入,这个函数会在遇到空格、换行、制表符这类空白字符时停止读取。所以输入"Hello World"时,array里只存了"Hello",后面的" World"根本没被读进来,自然无法处理,最后只输出处理后的"Hll"。
解决方法:改用fgets读取整行输入
fgets可以读取包含空格的整行文本,直到遇到换行符或达到指定长度。修改输入读取部分,同时注意处理fgets会把换行符也读入的问题:
修改后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char array[1000]; int x, y, len = 0; // 用fgets读取整行输入,最多读999个字符(留一个位置存'\0') fgets(array, sizeof(array), stdin); // 去掉fgets读入的换行符(如果存在) char *newline = strchr(array, '\n'); if (newline != NULL) { *newline = '\0'; } len = strlen(array); for (x = 0; x < len; x++) { // 判断是否为元音字母 if (array[x] == 'a' || array[x] == 'e' || array[x] == 'i' || array[x] == 'o' || array[x] == 'u' || array[x] == 'A' || array[x] == 'E' || array[x] == 'I' || array[x] == 'O' || array[x] == 'U') { // 移动字符覆盖元音 for (y = x; y < len; y++) { array[y] = array[y+1]; } x--; // 回退索引,避免跳过下一个字符 len--; // 有效长度减1 } } array[len] = '\0'; // 确保字符串正确终止(原代码里的len+1是错误的) printf("%s", array); return 0; }
额外优化点
- 原代码中
array[len + 1] = '\0';放在循环内部是错误且多余的:循环中len在递减,len+1可能超出有效范围,而且每次循环都设置没有必要,只需要在循环结束后设置array[len] = '\0'即可,因为此时len已经是处理后的字符串长度。 - 可以把元音判断逻辑封装成一个函数,让代码更简洁,比如:
int is_vowel(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U'; }
这样循环里的判断可以改成if (is_vowel(array[x])),可读性更好。
内容的提问来源于stack exchange,提问作者Dunkle Nacht
相关产品推荐
相关产品推荐

