You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:55:27