如何清空一个字符数组?

Posted

技术标签:

【中文标题】如何清空一个字符数组?【英文标题】:How to empty a char array? 【发布时间】:2010-12-06 06:43:12 【问题描述】:

有一个字符数组,如 char 成员 [255]。如何在不使用循环的情况下完全清空它?

char members[255];

“空”是指如果它存储了一些值,那么它不应该。例如,如果我执行 strcat,则不应保留旧值

members = "old value";

//empty it efficiently
strcat(members,"new"); // should return only new and not "old value new"

【问题讨论】:

“清空数组”是什么意思? members[0]=members[1]=members[2]=members[3]...=members[255]=0 没有循环 ;) 所以你的“数组”是一种特殊的数组:它是一个string。要“清空”字符串,请将其第一个元素设置为 '\0':members[0] = '\0'; 社区似乎支持 memset。但考虑到我的要求,这是最有效的方法吗? @Alex Xander:在这种情况下,“社区”显然是错误的。在某些情况下需要“memset”(例如清除数据以防止未经授权的使用),但对于简单的字符串重置(如您的情况),正确的答案是仅将第一个元素归零。 【参考方案1】:

使用

  memset(members, 0, 255);

一般

  memset(members, 0, sizeof members);

如果数组在范围内,或者

  memset(members, 0, nMembers * (sizeof members[0]) );

如果你只有指针值,而 nMembers 是数组中的元素个数。


编辑当然,现在要求已经从清除数组的一般任务更改为纯粹重置字符串,memset 太过分了,只需将第一个元素归零就足够了(如其他答案中所述)。


编辑为了使用memset,你必须include string.h

【讨论】:

+1 - 我会这样做,因为它可以确保所有数组元素都处于已知状态。 它违背了不使用循环的(史诗)要求。 虽然 memset 可能不是作为递归实现的,但它可能是 -- 在任何一种情况下,迭代都很好地隐藏在视线之外,这是表面上的要求。【参考方案2】:

取决于你所说的“空”:

members[0] = '\0';

【讨论】:

这只会改变 members[0] 的值,而不是 members[1] 到 members[254]。如果您按顺序访问很好......但在其他情况下就不那么好了。 在 OP 的编辑之后,我的解决方案似乎应该满足他的要求,因为 strcat() 会找到 NULL 字节并相应地处理它。 不是更好的解决方案。只是解决不同问题的方法。 没有办法在 C 中“清空”一个抽象数组。每个数组都包含一些东西,即使它是零。 “清空数组”的概念仅适用于数组内容的高级逻辑解释。例如,数组的内容可能被解释为 C 字符串。在这种情况下,“清空”的正确方法是将第一个元素设置为 '\0'。正是菲利克斯所做的。我不知道 OP 可能会想到什么其他解释,但如果没有更具体地说明,所有使用“memset”的尝试都只是对无意义问题的无意义答案。 @tinkertim:这里没有 NULL。不,'strcat' 不知道如何处理 NULL。如果您将 NULL 传递给它,它将崩溃。【参考方案3】:

如果您正在处理字符串,请不要费心尝试将您的 char 数组归零。下面是使用 char 字符串的简单方法。

复制(分配新字符串):

strcpy(members, "hello");

连接(添加字符串):

strcat(members, " world");

空字符串:

members[0] = 0;

就这么简单。

【讨论】:

【参考方案4】:

字符成员[255] = 0;

【讨论】:

不行,因为他没有指定必须在初始化后进行。尤其是他在编辑之前的第一个示例可能已经理解了这一点,因为清除数组也是非常常见的用例。 我给你+2作为他给你-1的补偿 :P :D【参考方案5】:

编辑:鉴于对问题的最新编辑,这将不再有效,因为没有空终止 - 如果您尝试打印数组,您会让你的字符后跟一些非人类可读的字符。但是,我将把这个答案留在这里作为社区 wiki 供后代使用。

char members[255] =  0 ;

应该可以。根据C编程语言:

如果数组有固定大小,初始化器的数量不能超过数组的成员数;如果数量较少,则剩余成员初始化为 0。

这意味着数组的每个元素的值都是 0。我不确定这是否是您认为“空”的值,因为 0 是 char 的有效值。

【讨论】:

这取决于你如何定义“空”。值为 0 的字符不是人类可读的字符,并且字符数组处于已知状态。我会认为那是空的。它也和 memset 做同样的事情(如果我对 memset 的记忆是正确的——我已经很久没有使用 C 语言了)。【参考方案6】:

使用bzero(array name, no.of bytes to be cleared);

【讨论】:

【参考方案7】:

你不能像这样清空一个数组,它总是包含相同数量的数据。

在更大的上下文中,数组中的数据可能表示一个空的项目列表,但必须在数组之外进行定义。最常见的方法是保留有效项目的计数(参见 pmg 的答案)或让字符串以零字符终止它们(Felix 的答案)。还有更复杂的方法,例如环形缓冲区使用两个索引来表示添加和删除数据的位置。

【讨论】:

【参考方案8】:
members[0] = 0;

足够了,考虑到您的要求。

请注意,这并不是“清空”缓冲区。内存仍然被分配,有效的字符值可能仍然存在,等等..

【讨论】:

也可以写成*members = 0; 即使0 也是有效字符。我们不知道members 是否被视为C 字符串。【参考方案9】:

我会去的

members_in_use = 0;

【讨论】:

这实际上很有意义,因为 OP 要求的操作(清空)不是 C 数组的一部分 - 因此,理想情况下,他会实现一个新的数据结构,并且pmg 表示结构为空的方式已经足够好了。 不,真的没有任何意义。 Kinopiko:显然你当时不了解这种方法 Kinopiko:阅读 starblue 的答案,因为它比我在评论中解释的更好地解释了我的推理(谢谢 starblue) 嗯,这是一个有趣的方法,members_in_use 仍然是一个数组吗?我以后可以做一个吗? member_in_use[5] = 价值?这是否等同于 memset(members_in_use, 0, 255);正如史蒂夫所说?如果是这样,为什么要使用一个而不是另一个?【参考方案10】:

如果您的意思是重置为 0,“清空数组”,那么您可以使用 bzero。

#include <strings.h>  
void bzero(void *s, size_t n);  

如果你想用一些其他默认字符填充数组,那么你可以使用 memset 函数。

#include <string.h>  
void *memset(void *s, int c, size_t n);  

【讨论】:

bzero 和 memset(通常)都使用循环。【参考方案11】:

在这种情况下,members[0] = 0 有效。

【讨论】:

【参考方案12】:

免责声明:我通常不使用 C 编程,因此我的示例中可能存在任何语法问题,但我希望我试图表达的想法是清晰的。

如果“emptying”的意思是“包含一个空字符串”,你可以将第一个数组项赋值为零,这将有效地使数组包含一个空字符串:

members[0] = 0;

如果“清空”的意思是“释放正在使用的内存”,那么您首先不应该使用固定的 char 数组。相反,您应该定义一个指向 char 的指针,然后根据需要执行 malloc / free(或字符串分配)。

仅使用静态字符串的示例:

char* emptyString="";
char* members;

//Set string value
members = "old value";

//Empty string value
member = emptyString

//Will return just "new"
strcat(members,"new");

【讨论】:

【参考方案13】:

您可以使用以下指令:

strcpy_s(members, "");

【讨论】:

以上是关于如何清空一个字符数组?的主要内容,如果未能解决你的问题,请参考以下文章

怎么用memset清空字符数组?

c语言中怎么把一个数组清空

ThinkPHP如何清空静态数组?

C语言中 如何把字符串中某一位清空?

c++如何确认数组的元素为空

在labview中如何将16进制字符串数组转化为十进制数值数组?