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

字符二维数组中指定字符串删除方法及现有代码优化咨询

无需嵌套循环的删除实现 + 新数组复制方案

当然可以不用嵌套循环啦!而且你提到的复制到新数组的思路也完全可行,我给你拆解两种实用的方案:

方案1:原地修改(无嵌套循环,更高效)

你原来的嵌套循环每次找到目标元素后,都要把后面所有元素往前挪一位,这种操作在数组较大或者有多个待删元素时,效率会比较低。我们可以用单指针追踪有效元素位置的方式,一次遍历就完成删除:

void remove_string(char array[100][6], char *string, int *array_size) {
    int idx = 0; // 记录要保留元素的存放位置
    for (int i = 0; i < *array_size; i++) {
        // 如果当前元素不是要删除的,就复制到idx位置,然后idx往前挪
        if (strcmp(array[i], string) != 0) {
            strcpy(array[idx], array[i]);
            idx++;
        }
    }
    // 更新数组的有效长度(删除元素后,实际有效的元素数量是idx)
    *array_size = idx;
}

小提示:

  • 这里把array_size改成指针传递,是因为我们需要修改原数组的有效长度(比如原来长度是3,删除后变成2),调用的时候传&size就可以了。
  • 整个过程只有一层循环,时间复杂度是O(n),比原来的嵌套循环(最坏情况O(n²))高效不少,逻辑也更清晰。

方案2:复制到新数组(更直观,不改动原数组)

如果你不想修改原数组,或者需要保留原始数据,直接创建一个新数组,把需要保留的元素复制进去就好:

// 返回新数组的有效元素长度
int remove_string_to_new(char array[100][6], char *string, int array_size, char new_array[100][6]) {
    int new_idx = 0;
    for (int i = 0; i < array_size; i++) {
        if (strcmp(array[i], string) != 0) {
            strcpy(new_array[new_idx], array[i]);
            new_idx++;
        }
    }
    return new_idx;
}

使用示例:

int main() {
    char arr[100][6] = {"john", "mark", "megan"};
    int size = 3;
    char new_arr[100][6];
    int new_size = remove_string_to_new(arr, "mark", size, new_arr);
    
    // 打印新数组内容
    for (int i = 0; i < new_size; i++) {
        printf("%s\n", new_arr[i]);
    }
    return 0;
}

说明:

  • 新数组提前分配好和原数组一样的固定空间就可以,如果你需要更灵活的大小,也可以用malloc动态分配内存(不过固定大小的场景下这样更简单)。
  • 这种方式完全不会改动原数组,适合需要保留原始数据的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:24:41