从字符数组中删除元素(C)

从字符数组中删除元素(C),c,arrays,C,Arrays,我试图从数组中删除一个字符,但遇到了问题。我读过如何使用数字,但它似乎不同于移除字符,因为它对我不起作用 如果我有以下数组: char stuff[][20] = {"one", "two", "three", "four", "five"}; 例如,如何删除元素“four”,以便获得 {"one", "two", "three", "five"}; 你将不得不复制字符串,并跟踪你认为有多少人,因为分配的空间本身不会消失。 你将不得不复制字符串,并跟踪你认为有多少人,因为分配

我试图从数组中删除一个字符,但遇到了问题。我读过如何使用数字,但它似乎不同于移除字符,因为它对我不起作用

如果我有以下数组:

char stuff[][20] = {"one", "two", "three", "four", "five"};     
例如,如何删除元素“four”,以便获得

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

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

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

< P>你可以通过动态分配所有需要的内存来实现这一点:一个char *数组以及字符串的内存。< /P> 然后,您可以创建另一个阵列,而不删除要删除的项,并复制剩余的所有数据。最后释放原始数组和字符串


这有点复杂,但不太难。如果您可以创建一个链表,可能会更容易一些,但这可能会稍微改变您的应用程序逻辑。

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

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


这有点复杂,但不太难。如果您可以创建一个链表,可能会更容易一些,但这可能会稍微改变您的应用程序逻辑。

您不能在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
然后清空第五个元素:

strcpy(stuff[3], stuff[4]); // overwrites "four" with "five"
strcpy(stuff[4], ""); // zeros out the first element in the subarray

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

{ "one", "two", "three", "five", "" }
如果您真的想更改列表中元素的数量(而不仅仅是清除最后一个),则必须使用不同的策略


像这样的问题通常需要一种称为;列表中的每个元素都显式地指向下一个元素。在链表中添加、删除和重新排序元素要比在数组中容易得多(即使数组可以用作后备存储)。网络上有许多例子(质量参差不齐)。然而,如果你能找到Sedgewick的“C语言中的算法”,那将是一个更好的资源

不能在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
然后清空第五个元素:

strcpy(stuff[3], stuff[4]); // overwrites "four" with "five"
strcpy(stuff[4], ""); // zeros out the first element in the subarray

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

{ "one", "two", "three", "five", "" }
如果您真的想更改列表中元素的数量(而不仅仅是清除最后一个),则必须使用不同的策略


像这样的问题通常需要一种称为;列表中的每个元素都显式地指向下一个元素。在链表中添加、删除和重新排序元素要比在数组中容易得多(即使数组可以用作后备存储)。网络上有许多例子(质量参差不齐)。然而,如果你能找到Sedgewick的“C语言中的算法”,那将是一个更好的资源

让编译器为您计数
char stuff[][20]=…
如何处理整数?字符串没有太大不同(请记住字符串是数组),让编译器为您计算
char stuff[][20]=…
如何处理整数?字符串没有太大的不同(只要记住字符串是数组),那么难吗?我的意思是,难道没有一个“remove”函数可以使用索引删除该元素吗?@Borja,没有。我明白了,C编程就是“自己动手”。如果我使用向量而不是数组来做这件事会更容易些?那么你可以使用std::list-在向量之间你不能删除。这难吗?我的意思是,难道没有一个“remove”函数可以使用索引删除该元素吗?@Borja,没有。我明白了,C编程就是“自己动手”。如果我使用向量而不是数组来做这件事会更容易些?那么你可以使用std::list-使用向量你不能在中间删除。是的,我需要更改元素的数量,所以索引也会更改。谢谢你的推荐。将尝试链接列表。是的,我需要更改元素的数量,因此索引也会更改。谢谢你的推荐。将尝试链接列表。