字符二维数组中指定字符串删除方法及现有代码优化咨询
无需嵌套循环的删除实现 + 新数组复制方案
当然可以不用嵌套循环啦!而且你提到的复制到新数组的思路也完全可行,我给你拆解两种实用的方案:
方案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
相关产品推荐
相关产品推荐

