c - 如何删除二维字符数组指针的一项
问题描述
我正在使用一个二维字符数组指针,换句话说,一个字符串数组的数组。这个指针在一个内部struct
,我正在尝试删除一个字符串数组。
换句话说,如果我有以下数组:
{ { "Foo", "Bar" }, { "Baz", "Fee" }, { "Var", "Bar" } }
我正在尝试删除中间数组
{ { "Foo", "Bar" }, { "Var", "Bar" } }
以下struct
是
struct Data {
int size;
char(*items)[10][64];
}
我尝试迭代数组并将前面的位置向后移动,如下所示(假设我试图消除位置 1)
int positionInArray = 1;
// Suppose that data struct is filled
for (int x = positionInArray; x < data->size; x+ ) {
(*(*data->items[x])) = (*(*data->items[x+1]));
}
我不确定这是正确的方法,显然我无法删除该项目。
解决方案
如果您使用普通的数组索引而不是指针取消引用,则不会那么混乱。您可以使用memcpy()
一次复制整行。
如果字符串是动态分配的,那么在移动数组元素之前,您需要释放要删除的行所指向的项目。
for (int x = 0; x < sizeof(data->items[0])/sizeof(data->items[0][0]); x++) {
free(data->items[positionInArray][x]);
}
那么你的for
循环移动行的限制应该是size-1
,否则你会尝试将行复制到最后一个有效行之后。
for (int x = positionInArray; x < data->size-1; x++) {
memcpy(data->items[x], data->items[x+1], sizeof(data->items[x]));
}
data->size--;
推荐阅读
- python - 将有问题的固定宽度文本文件解析为 pandas 数据框
- javascript - 如何编辑变量中的格式化文本?
- python - 如何尽可能高效地合并许多二进制文件?
- sql - SQL 查询然后数据透视表。字段问题
- mysql - RT5 运行缓慢
- batch-file - 我可以做些什么来帮助这个批处理脚本正常工作?
- xamarin.forms - 如何在 Xamarin 中按条件从列表中获取数据
- flutter - 无法解决 com.android.tools.build:gradle:4.0.1 的修复方法是什么。在颤振vscode中?
- nginx - nginx 和 postgres db: nginx: [emerg] 0.0.0.0:80 的重复监听选项
- google-chrome - 在 Chrome 开发工具中找不到 Xhr 请求的来源。(显示 jquery 作为发起者)