C++字符数组实现单词首字母后续重复字符删除且保留原有空格的代码修复
修复方案
问题原因
你原来的代码使用strtok拆分单词,这个函数会把所有连续空格都作为分隔符处理,直接丢弃了原有的空格间隔信息,因此无法保留单词间的原有空格数量。
实现思路
不拆分字符串,直接逐字符遍历整个输入数组:
- 遇到空格直接原样输出,保留原有空格数量
- 识别到单词起始位置时,先记录首字母,仅输出首字母之后和首字母不重复的字符
- 全程不修改原输入数组的结构,只在输出时过滤单词内部的重复首字母
修复后代码
#include <iostream> #include <cstring> using namespace std; void check(char *input) { int len = strlen(input); int i = 0; while (i < len) { // 遇到空格直接原样输出 if (input[i] == ' ') { cout << ' '; i++; } else { // 记录单词首字母并输出 char first = input[i]; cout << first; i++; // 处理单词剩余字符 while (i < len && input[i] != ' ') { if (input[i] != first) { cout << input[i]; } i++; } } } cout << endl; } int main() { setlocale(LC_ALL, "Ukrainian"); char *input = new char[100]; // 注:gets函数存在缓冲区溢出风险,此处保留原有写法,生产环境建议替换为fgets gets(input); check(input); delete[] input; return 0; }
代码说明
- 全程仅遍历一次输入字符数组,时间复杂度为O(n),效率更高
- 所有空格字符直接原样输出,完全保留原有空格数量
- 仅过滤单词内部首字母之后的重复首字母,其余字符不受影响
- 完全符合要求:未使用
std::string,仅依赖<cstring>库的strlen函数
内容的提问来源于stack exchange,提问作者LLLORIS
相关产品推荐
相关产品推荐

