请求排查C++代码Bug:提取含重复字符单词并格式化空格
代码Bug分析与修复
你的代码主要在重复字符检测逻辑、字符串修改操作以及循环控制上存在多处问题,导致无法正确筛选出含重复字符的单词,具体问题和修复方案如下:
核心Bug点
- 重复字符检测逻辑混乱:
- 内层
for循环使用first和first2作为循环变量,但未在每个单词处理前重置,导致处理后续单词时,变量仍停留在上一个单词的末尾位置,无法从头检测重复。 - 检测逻辑倒置:你当前的逻辑是“没找到重复字符时删除单词”,但实际需求是保留有重复的单词,删除无重复的,逻辑完全搞反。
- 内层
- 字符串删除操作错误:
删除单词的循环for (j = start; str[end] != '\0'; ++end)逻辑错误,无法正确将后续字符前移覆盖待删除的单词,且未调整i的位置,导致字符串长度变化后遍历出错。 - 未处理多余空格:代码中完全没有合并连续空格的逻辑,无法满足“仅保留1个空格”的需求。
- 循环嵌套冗余:外层
while (first < last)与内层for循环重复,且break仅跳出最内层循环,无法终止整个检测流程。
修复后的代码
#include <iostream> #include <cstdio> #include <cstring> using namespace std; // 判断单词是否包含重复字符 bool hasDuplicateChars(const char* word) { int count[256] = {0}; // 覆盖ASCII字符集 for (int k = 0; word[k] != '\0'; k++) { count[(unsigned char)word[k]]++; if (count[(unsigned char)word[k]] >= 2) { return true; } } return false; } int main() { char str[128]; printf("Write String: "); fgets(str, 128, stdin); // 第一步:去除多余空格,仅保留单个空格 int len = strlen(str); int pos = 0; bool prevSpace = false; for (int i = 0; i < len; i++) { if (str[i] == ' ' || str[i] == '\n') { if (!prevSpace) { str[pos++] = ' '; prevSpace = true; } } else { str[pos++] = str[i]; prevSpace = false; } } str[pos] = '\0'; // 确保字符串结束符 // 第二步:筛选保留含重复字符的单词 char result[128] = {0}; int resPos = 0; int start = 0; int i = 0; while (str[i] != '\0') { if (str[i] == ' ') { // 提取当前单词 char word[64]; int wordLen = i - start; strncpy(word, str + start, wordLen); word[wordLen] = '\0'; // 如果单词有重复字符,加入结果 if (hasDuplicateChars(word)) { strcpy(result + resPos, word); resPos += wordLen; result[resPos++] = ' '; } start = i + 1; } i++; } // 处理最后一个单词 char word[64]; int wordLen = i - start; strncpy(word, str + start, wordLen); word[wordLen] = '\0'; if (hasDuplicateChars(word)) { strcpy(result + resPos, word); resPos += wordLen; } // 去掉末尾多余的空格 if (resPos > 0 && result[resPos-1] == ' ') { result[resPos-1] = '\0'; } else { result[resPos] = '\0'; } // 输出结果 printf("Result: %s\n", result); return 0; }
关键修复说明
- 拆分功能:将重复字符检测封装为独立函数
hasDuplicateChars,逻辑清晰且易于维护,通过字符计数的方式快速判断是否有重复。 - 先处理空格:单独遍历字符串,合并连续空格,确保最终字符串仅含单个分隔空格。
- 逐词筛选:遍历处理后的字符串,逐个提取单词,判断是否符合条件,将符合条件的单词拼接成结果字符串,避免直接修改原字符串带来的遍历混乱。
- 边界处理:单独处理最后一个单词,同时移除结果字符串末尾的多余空格,保证输出格式正确。
测试输入I like to play soccer every day时,输出为soccer every,符合需求。
内容的提问来源于stack exchange,提问作者Gently Barry
相关产品推荐
相关产品推荐

