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

C++字符串去元音问题:单字符输出异常及char[]版本实现咨询

std::string版本的问题与修正

你的removeVowels函数实现存在两个核心错误,导致仅输出单个字符:

  1. 循环范围错误:i < input.length() - 1会跳过字符串的最后一个字符(索引为input.length()-1),正确的循环条件应为i < input.length()。
  2. 字符串赋值逻辑错误:outputNoVowels = input[i];是直接用单个字符覆盖整个字符串,每次都会清空之前的内容,最终仅保留最后一个非元音字符。应使用+=运算符将字符追加到字符串末尾。

修正后的代码:

string removeVowels(string input) {
    string outputNoVowels;
    
    for (int i = 0; i < input.length(); i++) {
        switch (input[i]) {
        case 'a': case 'e': case 'i': case 'o': case 'u':
        case 'A': case 'E': case 'I': case 'O': case 'U':
            break; // 元音字符直接跳过
        default:
            outputNoVowels += input[i]; // 追加非元音字符到结果字符串
        }
    }
    return outputNoVowels;
}
char[]版本的问题与修正

你的char数组版本实现逻辑完全错误,strcpy和strcat的用法不符合需求,正确的做法是逐个遍历输入字符,将非元音字符依次写入输出数组,最后添加字符串结束符'\0':

  1. 循环范围错误:同样需要将i < strlen(input) - 1改为i < strlen(input),避免漏掉最后一个字符。
  2. 字符写入逻辑错误:不能直接用strcpy/strcat复制整个输入,需要维护一个输出数组的索引,逐个写入非元音字符。
  3. 必须添加结束符:char数组形式的字符串必须以'\0'结尾,否则会出现乱码。

修正后的代码:

#include <cstring> // 需包含strlen的头文件

void removeVowels(const char input[], char output[]) {
    int j = 0; // 输出数组的当前写入索引
    int len = strlen(input);
    for (int i = 0; i < len; i++) {
        switch (input[i]) {
        case 'a': case 'e': case 'i': case 'o': case 'u':
        case 'A': case 'E': case 'I': case 'O': case 'U':
            break;
        default:
            output[j++] = input[i]; // 写入非元音字符,索引自增
        }
    }
    output[j] = '\0'; // 添加字符串结束符,确保输出为合法C风格字符串
}

注意:调用char数组版本时,需确保输出数组的大小足够容纳处理后的字符串(至少与输入数组长度相同),避免缓冲区溢出。

内容的提问来源于stack exchange,提问作者wackflapjack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:20:47