如何删除2d字符数组中的字符串

时间:2018-05-22 11:26:24

标签: c arrays string

给定2d字符数组,换句话说,给定大小的字符串数组,例如:

char array[100][6];

并且数组填充如下:

{"john", "mark", "megan"} and so on...

如何删除给定的单词?例如,删除“mark”。

我在某处读到了我们必须用下一个替换要删除的字符串。

到目前为止的代码:

void remove_string(char array[100][6], char *string, int array_size){
    for(int i = 0; i < array_size; i++){
        if(strcmp(array[i], string) == 0){
            for(int j = i; j < array_size; j++){
                strcpy(array[j], array[j+1]);
            }
        }
    }
}

删除“mark”后的预期结果:

{"john", "megan"}

代码似乎有用,但可以在不使用其他循环的情况下完成吗?

我还试图将除了要移除的一个单词复制到另一个数组并返回新数组,但我似乎无法找到只复制“其他单词”。

3 个答案:

答案 0 :(得分:1)

你不能从这种表中“删除”字符串。你只能将它设为零大小

char *remove_string(char *arr, size_t nstrings, size_t strlength, size_t string)
{
    if (!arr || string >= nstrings) retun NULL;
    arr[strlrength * string] = 0;
    return arr + strlrength * string
}

** char指针表相同(假设为字符串分配了空间)。如果已经为指针指定了ReadOnly字符串文字的地址,那么它将无效。

char *remove_string_from_table_of_pointers(char **arr, size_t nstrings, size_t string)
{
    if (!arr || string >= nstrings) retun NULL;
    if(arr[string]) arr[string][0] = 0;
    return arr[string];
}

如果字符串是“malloced”,你也可以完全删除字符串,释放内存

int completely_remove_string_from_table_of_pointers(char **arr, size_t nstrings, size_t string)
{
    if (!arr || string >= nstrings) retun -1;
    if(arr[string]) free(arr[string]);
    arr[string] = NULL;
    return 0;
}

答案 1 :(得分:1)

你的函数中已经有一个遍历元素的循环。您可以使用相同的循环删除适当的元素。

迭代时你需要的是另一个整数。该整数将保存当前元素需要在数组中移动的索引。

在你的函数中声明一个新的整数为 -

int new_position = 0;

现在在循环中,您通常会检查字符串是否与删除字符串匹配 -

for (int i = 0; i < array_size; i++) {
    if (strcmp(array[i], string) == 0) {
        // Do nothing. and continue
        continue;       
    }
    if (new_position != i) {
        //Move the other elements 
        array[new_position] = array[i];
    }
    new_position++;
}

array_size = new_position; 

这也将自动保留元素的顺序并删除所有匹配的元素。

答案 2 :(得分:0)

您无法从固定大小的数组中删除项目。您需要做的是从索引 n 移动所有项目,然后在数组中向前移动一步,覆盖前一个项目。

这是非常无效的,这就是链接列表被发明的原因:当需要在容器中间添加/删除项目时,它们比数组更合适。