给定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"}
代码似乎有用,但可以在不使用其他循环的情况下完成吗?
我还试图将除了要移除的一个单词复制到另一个数组并返回新数组,但我似乎无法找到只复制“其他单词”。
答案 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 移动所有项目,然后在数组中向前移动一步,覆盖前一个项目。
这是非常无效的,这就是链接列表被发明的原因:当需要在容器中间添加/删除项目时,它们比数组更合适。