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

请求排查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;
}

关键修复说明

  1. 拆分功能:将重复字符检测封装为独立函数hasDuplicateChars,逻辑清晰且易于维护,通过字符计数的方式快速判断是否有重复。
  2. 先处理空格:单独遍历字符串,合并连续空格,确保最终字符串仅含单个分隔空格。
  3. 逐词筛选:遍历处理后的字符串,逐个提取单词,判断是否符合条件,将符合条件的单词拼接成结果字符串,避免直接修改原字符串带来的遍历混乱。
  4. 边界处理:单独处理最后一个单词,同时移除结果字符串末尾的多余空格,保证输出格式正确。

测试输入I like to play soccer every day时,输出为soccer every,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:35:17