从char数组中删除元素(C)

时间:2013-05-21 14:01:56

标签: c arrays

我正在尝试从数组中删除一个字符,但我遇到了问题。我读了如何使用数字来做,但它似乎与删除字符有所不同,因为它不适合我。

如果我有以下数组:

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

如何删除元素“four”,例如,我可以

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

3 个答案:

答案 0 :(得分:3)

你可以通过动态分配所有需要的内存来做到这一点:char *的数组以及字符串的内存。

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

这有点复杂但不太难。如果您可以创建链接列表可能会更容易 - 但这可能会更改您的应用程序逻辑。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您无法在C中更改数组的大小;如声明的那样,您的stuff数组将始终具有5个元素(其中每个元素是一个20个元素的char数组)。

可以做的是将第五个元素的内容复制到第四个元素:

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语言算法”的副本,那将是一个更好的资源。