2013-05-21 175 views
0

我试图从数组中删除char,并且遇到问题。我读了如何用数字做它,但它似乎不同于删除字符,因为它不适合我。从char数组中删除元素(C)

如果我下面的数组:

char stuff[][20] = {"one", "two", "three", "four", "five"};  

我怎样才能删除元素“四大”为例,这样我就可以得到

{"one", "two", "three", "five"}; 
+2

让编译器为你计算'char stuff [] [20] = ...' –

+2

你如何用整数来做到这一点?这与字符串没什么不同(只记得一个字符串是一个数组) – pmg

回答

2

你将需要复制字符串,并跟踪您认为存在多少,因为分配的空间本身不会消失。

+0

它现在是有效的;) –

+1

@Borja检查,我删除了那句话,谢谢。 – unwind

3

您可以通过动态分配所有需要的内存来执行此操作:char *数组以及字符串内存。

然后,您可以创建另一个阵列,而不需要删除项目并复制剩下的所有数据。最后释放原始数组和字符串。

这有点复杂但不太难。如果你可以创建一个链表 - 可能会更容易 - 但这可能会更多地改变你的应用程序逻辑。

+0

这很难吗?我的意思是,是不是有一个“删除”功能,使用索引,你可以删除该元素? –

+1

@Borja,不。 C编程有很多“自己动手”。 –

+0

我明白了。如果我使用矢量而不是阵列来做这件事会更容易些? –

1

您不能更改C中数组的大小;如声明的,你的stuff数组总是有5个元素(其中每个元素都是char的20个元素的数组)。

什么你可以做的是第五种元素的内容复制到第四个元素:

strcpy(stuff[3], stuff[4]); // overwrites "four" with "five" 

,然后空出第五元素:

strcpy(stuff[4], ""); // zeros out the first element in the subarray 

memset(stuff[4], 0, sizeof stuff[4]); // zeros out entire subarray 

无论哪种方式,你的数组现在将包含字符串

{ "one", "two", "three", "five", "" } 

如果你真的想改变号码列表中的元素的(而不仅仅是清除掉最后一个),你将不得不使用不同的策略。

这样的问题通常需要一个数据结构,称为linked list;列表中的每个元素明确指向下一个元素。您可以比在数组中更容易地添加,移除和重新排序链表中的元素(即使数组可以用作后备存储)。 Web上有许多示例(质量各不相同)。但是,如果您能找到Sedgewick的“C算法”的副本,那将是更好的资源。

+0

是的,我需要改变元素的数量,所以索引也会改变。感谢您的建议。将尝试链接列表。 –