C++字符串去元音问题:单字符输出异常及char[]版本实现咨询
std::string版本的问题与修正
你的removeVowels函数实现存在两个核心错误,导致仅输出单个字符:
- 循环范围错误:
i < input.length() - 1会跳过字符串的最后一个字符(索引为input.length()-1),正确的循环条件应为i < input.length()。 - 字符串赋值逻辑错误:
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':
- 循环范围错误:同样需要将
i < strlen(input) - 1改为i < strlen(input),避免漏掉最后一个字符。 - 字符写入逻辑错误:不能直接用
strcpy/strcat复制整个输入,需要维护一个输出数组的索引,逐个写入非元音字符。 - 必须添加结束符: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
相关产品推荐
相关产品推荐

