如何在C中删除字符指针数组

如何在C中删除字符指针数组,c,arrays,string,C,Arrays,String,我想删除以下内容中包含“某物”的单元格: 我该怎么做?我试过了,但没用 for(i=0;i<100;ti++) { if(strcmp(a[i],"sth")!=0) temp[i]=a[i]; } a=temp //not sure here for(i=0;i不能从这样的数组中删除单元格。可以将其设置为任意值,如空字符串 更困难的是: 计算要删除的项目数 创建一个新的更小的数组 将所需项目从旧阵列复制到新阵列 删除旧的 你可能想知道为什么像这样简单的事情如此复杂。原

我想删除以下内容中包含“某物”的单元格:

我该怎么做?我试过了,但没用

for(i=0;i<100;ti++)
{

 if(strcmp(a[i],"sth")!=0)
    temp[i]=a[i];
}
a=temp  //not sure here

for(i=0;i不能从这样的数组中删除单元格。可以将其设置为任意值,如空字符串

更困难的是:

  • 计算要删除的项目数
  • 创建一个新的更小的数组
  • 将所需项目从旧阵列复制到新阵列
  • 删除旧的

你可能想知道为什么像这样简单的事情如此复杂。原因是数组是内存中的一系列数据。它的工作原理类似于一个有很多抽屉的文件柜。你可以告诉程序要在抽屉里放什么,但你不能在不破坏整个文件柜的情况下真正除去其中的一部分。所以你必须做出一个决定新的。

您不能从这样的数组中删除单元格。您可以将其设置为任意值,例如空字符串

更困难的是:

  • 计算要删除的项目数
  • 创建一个新的更小的数组
  • 将所需项目从旧阵列复制到新阵列
  • 删除旧的
你可能想知道为什么像这样简单的事情如此复杂。原因是数组是内存中的一系列数据。它的工作原理类似于一个有很多抽屉的文件柜。你可以告诉程序要在抽屉里放什么,但你不能在不破坏整个文件柜的情况下真正除去其中的一部分。所以你必须做出一个决定新的。

类似

j=0;
for(i=0;i<100;i++)
{
    a[j]=a[i];
    if(strcmp(a[i],"sth")) {
     j++;
    }else{
     a[j]=0;
    }
}
j=0;
对于(i=0;i类似

j=0;
for(i=0;i<100;i++)
{
    a[j]=a[i];
    if(strcmp(a[i],"sth")) {
     j++;
    }else{
     a[j]=0;
    }
}
j=0;

对于(i=0;我不确定您试图实现的目标。是否要从数组中删除单个元素,因为这并不是那么简单,还是需要其他内容?从数组中删除单个元素。通过“删除”,你的意思是释放它指向的内存,使它指向下一个字符串,将它设置为NULL,还是这些的组合?使它指向下一个字符串。对不起,如果我没有问你,也许你是从另一种语言来C的?我想你想要的是一个列表、哈希表或某种描述的动态数组。这些不是作为标准内置到C中的rd但您可以使用第三方实现来避免重新发明轮子,例如,不确定您试图实现的目标。是否要从数组中删除单个元素,因为这并不是那么简单,还是要删除其他元素?从数组中删除单个元素。通过“删除”,你的意思是释放它指向的内存,使它指向下一个字符串,将它设置为NULL,还是这些的组合?使它指向下一个字符串。对不起,如果我没有问你,也许你是从另一种语言来C的?我想你想要的是一个列表、哈希表或某种描述的动态数组。这些不是作为标准内置到C中的rd但您可以使用第三方实现来避免重新发明轮子,例如,将a[j]设置为零除了在上一次迭代中没有持久的效果,因为a[j]在下一次迭代中被覆盖。如果您的目的是在保留的元素下移后将a的所有尾随元素设置为零,那么更好的方法是在该元素之后的第二个循环中将它们设置为零,该循环将j从其最终值从第一个循环增加到100。此外,第一个循环中有一个输入错误:
ti++
s应该是
i++
。我添加了a[j]来处理最后一个元素,而没有在代码末尾添加if语句。否则,如果最后一个元素是“sth”,那么它将是keptAdding
if(j<100)a[j]=0;
实现了相同的效果,并且平均来说计算成本更低。但这有什么意义呢?它不能是哨兵,因为如果j达到100,它就不存在。它不会清除所有释放的元素,因为在a[j]之后可能会有更多元素。将a[j]设置为零除了在上一次迭代中没有持久的效果,因为a[j]在下一次迭代中被覆盖。如果您的目的是在保留的元素下移后将a的所有尾随元素设置为零,那么更好的方法是在该元素之后的第二个循环中将它们设置为零,该循环将j从其最终值从第一个循环增加到100。此外,第一个循环中有一个输入错误:
ti++
s应该是
i++
。我添加了a[j]来处理最后一个元素,而没有在代码末尾添加if语句。否则,如果最后一个元素是“sth”,那么它将是keptAdding
if(j<100)a[j]=0;
实现了相同的效果,平均而言,计算成本更低。但这有什么意义呢?它不能是哨兵,因为如果j达到100,它就不存在。它不会清除所有释放的元素,因为在[j]之后可能会有更多。或者,在这种情况下,您可以设置“空”指向NULL的指针,而不是字符串。在尝试访问指向的数据之前,程序必须检查每个指针是否为NULL。或者,在这种情况下,您可以设置“空”指向NULL的指针,而不是字符串。然后程序必须检查每个指针是否为NULL,然后才能尝试访问指向的数据。