2012-08-10 52 views
1

我想删除它有“某事”的细胞:如何删除字符指针数组用C

char* a[200]; 

我应该怎么办呢?我尝试过,但它不起作用!

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

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

'a = temp'不会被编译。 – cnicutar 2012-08-10 09:44:22

+0

不知道你在努力达到什么目的。你是否想从数组中删除单个元素,因为那不是那么简单,还是你想要其他的东西? – 2012-08-10 09:44:36

+0

从数组中删除单个元素。 – Sara 2012-08-10 09:45:23

回答

2

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

我没有免费的内存在这里,因为我不知道在哪里的字符串是从哪里来的。如果字符串被分配了malloc,它们应该被释放(如果不在其他地方使用)

+1

将[j]设置为零除了在最后一次迭代中没有持久效果,因为在下一次迭代中将覆盖[j]。如果你的意图是在被保留的元素向下移动之后将a的所有尾随元素设置为零,那么更好的方法是在第二个循环中将它们设置为零,然后在第一个循环中将j从它的最终值循环到100.另外,在第一个循环中有一个错字:'ti ++'应该是'i ++'。 – 2012-08-10 10:42:09

+0

我添加了a [j]来处理最后一个元素,而不在代码的末尾添加if语句。否则,如果最后一个元素是“sth”,它将被保留 – Gir 2012-08-10 10:46:54

+0

添加'if(j <100)a [j] = 0;'实现相同的效果并且在计算上更便宜。但是有什么意义呢?它不能成为一个哨兵,因为如果j达到100时它不存在,它不会清除所有释放的元素,因为在[j]之后可能会有更多元素。 – 2012-08-10 12:22:33

2

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

更难的方法是:

  • 算你想删除
  • 创建一个新的小阵列
  • 复制的项目从旧阵列需要在新的一个
  • 的项目删除旧的。

你可能想知道为什么这样简单的事情太复杂了。原因是数组是内存中的一系列数据。它的作用就像一个有很多抽屉的局。你可以告诉程序在抽屉里放什么东西,但是在不破坏整个局的情况下,你不能真正摆脱它的一部分。所以你必须做一个新的。

+1

另外,在这种情况下,您可以设置一个“空”指针指向NULL,而不是字符串。然后,程序会在尝试访问指向的数据之前,检查每个指针是否针对NULL。 – Lundin 2012-08-10 10:47:48