C语言数组单词删除函数bug求助:删除后出现重复元素
问题分析与修复方案
问题根源
你的delete()函数存在两个核心问题:
- 元素前移不完整:找到要删除的单词后,仅将当前位置替换为下一个元素,没有把后续所有元素依次向前移动。比如删除
mango(索引1)时,只把banana(索引2)复制到索引1,但apple(索引3)仍留在原位置,原索引2的banana未被覆盖,最终数组前3项变成coconut、banana、banana。 - 循环条件限制:
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
相关产品推荐
相关产品推荐

