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

C语言数组单词删除函数bug求助:删除后出现重复元素

问题分析与修复方案

问题根源

你的delete()函数存在两个核心问题:

  1. 元素前移不完整:找到要删除的单词后,仅将当前位置替换为下一个元素,没有把后续所有元素依次向前移动。比如删除mango(索引1)时,只把banana(索引2)复制到索引1,但apple(索引3)仍留在原位置,原索引2的banana未被覆盖,最终数组前3项变成coconut、banana、banana。
  2. 循环条件限制:for (int i = 0; i < *nrOfWords - 1; i++)的条件会导致最后一个元素无法被检查和删除。

最小改动修复后的代码

仅修改delete()函数,其余代码保持不变:

void delete(char word[][MAX], int *nrOfWords) {
    char deleteWord[MAX];

    while (1) {
        printf("Word to delete:");
        scanf("%s%*c", deleteWord); // 去掉&,数组名本身是指针
        if (strcmp(deleteWord, "q") == 0)
            break;    
        for (int i = 0; i < *nrOfWords; i++) { // 修改循环条件为遍历所有元素
            if (strcmp(word[i], deleteWord) == 0) {
                // 把i之后的所有元素依次向前挪一位
                for (int j = i; j < *nrOfWords - 1; j++) {
                    strcpy(word[j], word[j + 1]);
                }
                (*nrOfWords)--;
                i--; // 回退索引,避免跳过下一个元素(处理重复项时需要)
                break; // 只删除第一个匹配项,若要删除所有匹配项可去掉此行
            }
        }
    }
}

关键修改点

  • 调整循环条件为i < *nrOfWords,确保能检查到最后一个单词。
  • 新增内层循环完成完整的元素前移,彻底覆盖被删除元素的位置,并把后续所有元素依次向前靠拢。
  • 删除元素后执行i--,避免因循环的i++跳过下一个元素(如果存在多个相同单词需要删除)。
  • 可选:保留break则只删除第一个匹配的单词,去掉则删除所有匹配项,根据需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:34