清除 char 数组 c

clearing a char array c

提问人:ant2009 提问时间:3/11/2009 最后编辑:Nakilonant2009 更新时间:8/4/2018 访问量:446359

问:

我认为通过将第一个元素设置为 null 可以清除 char 数组的全部内容。

char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';

但是,这只会将第一个元素设置为 null。

my_custom_data[0] = 0; 

而不是使用 ,我认为上面的 2 个示例应该清除所有数据。memset

C 数组字符

评论

1赞 Johannes Schaub - litb 3/11/2009
Jared,你为什么要设置 c++ 标签?他谈到了“C”,没有添加任何与C++相关的标签。
2赞 Adam Hawes 3/11/2009
这同样适用于C++中的字符数组,即使他没有指定。
4赞 Alnitak 3/12/2009
我删除了 C++ 标签,以避免我们已经看到的人提供 C++ 特定解决方案

答:

2赞 Michael 3/11/2009 #1

您应该使用 memset。只设置第一个元素是行不通的,你需要设置所有元素 - 如果没有,你怎么能只将第一个元素设置为0?

评论

0赞 Johann Gerell 3/11/2009
不应将 MEMSET 用于可读性:stackoverflow.com/questions/453432/...
128赞 JaredPar 3/11/2009 #2

这取决于您希望如何查看数组。如果将数组视为一系列字符,则清除数据的唯一方法是触摸每个条目。 可能是实现这一目标的最有效方法。memset

另一方面,如果您选择将其视为 C/C++ null 终止字符串,则将第一个字节设置为 0 将有效地清除该字符串。

评论

4赞 Arnold Spence 3/11/2009
他们在答案中的关键词是“有效”。只有第一个元素的 begin 设置为 0,其余元素仍具有未定义的值,但如果将数组视为以 null 结尾的字符串,并且第一个元素为 null,则该字符串被视为空。
0赞 Johannes Schaub - litb 3/11/2009
事实上,这就是答案。
0赞 JaredPar 3/11/2009
@caparcode,没错。这就是为什么了解数组的使用方式非常重要的原因。
0赞 ant2009 3/11/2009
是的,这就是我应该在我的第一篇文章中说的。char 是终止字符串。所以这些都会做这个把戏。字符[0] = '\0';或者 char[0] = 0。我不确定,但我听说使用“\0”更适合使用以 null 结尾的字符串。
0赞 Mark Testa 3/11/2009
@robUK,是的,你是对的。从技术上讲,“\0”等于 0(在 ascii 中),但您应该使用“\0”,因为它可以明确您的意图
4赞 Alan 3/11/2009 #3

不。您所要做的就是将第一个值设置为“\0”或 0。

如果您使用的是以 null 结尾的字符串,那么在第一个示例中,您将获得模仿预期的行为,但仍设置了内存。

如果要在不使用 memset 的情况下清除内存,请使用 for 循环。

评论

0赞 Zan Lynx 3/11/2009
我在 for 循环上说不。尽量不要编写自己的“改进”(通常不是)库函数。事实上,memset 和 memcpy 是相当特殊的,它们通常根据已知的数据对齐和长度内联到 CPU 的自定义机器代码中。
0赞 Adam Hawes 3/11/2009
@Zan OP 不想使用 memset(也许他已经嵌入并且没有可用的)。但是,是的,memset 通常是非常优化的,并且可能比 for 循环更快。
0赞 Alan 3/11/2009
没错,但是他不想使用 memset,所以我建议使用 for 循环。
2赞 tvanfosson 3/11/2009 #4

将 null 字符写入第一个字符就是这样做的。如果将其视为字符串,则遵循 null 终止字符的代码会将其视为 null 字符串,但这与清除数据不同。如果要实际清除数据,则需要使用 memset。

82赞 John Feminella 3/11/2009 #5

C 语言中的数组只是一个内存位置,因此,实际上,您的赋值只是将第一个元素设置为零,而其他元素保持不变。my_custom_data[0] = '\0';

如果你想清除数组的所有元素,你必须访问每个元素。这是为了:memset

memset(&arr[0], 0, sizeof(arr));

这通常是解决这个问题的最快方法。如果可以使用 C++,请考虑改用 std::fill:

char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);

评论

2赞 David Rodríguez - dribeas 3/11/2009
我认为第二个版本应该是: std::fill( arr, arr+ sizeof(arr)/sizeof(arr[0]), 0 );
0赞 Zan Lynx 3/11/2009
澄清:不要将 sizeof 与 fill 一起使用,因为您以后会遇到 int、long、double 或您拥有的数组的麻烦。
1赞 Zan Lynx 3/11/2009
我更喜欢:std::fill(&arr[0], &arr[arr_len], 0);
0赞 Johannes Schaub - litb 3/11/2009
Zan Lynx,这是未定义的行为。你不能做 &arr[arr_len]。但你必须做 std::fill(arr, arr + sizeof arr, 0);或者,如果你的长度在某个地方 std::fill(arr, arr + arr_len, 0);假设 char 数组
0赞 Johannes Schaub - litb 3/11/2009
它仅在 C 中有效。虽然这个问题显然是针对 C 的(另一个人添加了一个C++标签,我不知道为什么),但 std::fill 显示了C++亲和力:)
7赞 John Fricker 3/11/2009 #6

为什么不使用 ?就是这样做的。memset()

设置第一个元素会保持内存的其余部分不变,但 str 函数会将数据视为空。

评论

1赞 Johann Gerell 3/11/2009
不要将 memset 用于可读性:stackoverflow.com/questions/453432/...
2赞 mkb 11/11/2016
那你的答案是什么?
27赞 abelenky 3/11/2009 #7

为什么您认为设置单个元素会清除整个数组? 特别是在 C 语言中,如果没有程序员显式编程,几乎不会发生任何事情。如果将第一个元素设置为零(或任何值),则您已经完全这样做了,仅此而已。

初始化时,您可以将数组设置为零:

char mcd[40] = {0}; /* sets the whole array */

否则,除了 memset 或类似的东西之外,我什么都不懂。

评论

0赞 cocoafan 3/11/2011
我想这取决于您使用的编译器
1赞 abelenky 3/12/2011
@cocoafan:不,它不依赖于编译器。它是语言规范的一部分。任何行为不同的编译器都不遵循 C 语言。
0赞 cocoafan 3/13/2011
我不知道,谢谢。我找不到任何可以阅读此特殊情况的资源。把它作为书签就好了。
1赞 abelenky 3/13/2011
这称为部分初始化。我没有 C99 规范,但这里有两个来源:bit.ly/enBC2m“您不需要初始化数组中的所有元素。如果数组被部分初始化,则未初始化的元素将收到相应类型的值 0。bit.ly/f9asHH“如果初始值设定项少于数组中的元素,则其余元素将自动初始化为 0”
0赞 skinnedknuckles 10/27/2018
这不适用于已经声明并分配了值的数组,是吗?
1赞 hhafez 3/11/2009 #8

我想通过设置第一个元素 到 null 将清除整个 char 数组的内容。

正如你所发现的那样,这是不正确的

但是,这仅设置第一个 元素设置为 null。

完全!

您需要使用 memset 清除所有数据,将其中一个条目设置为 null 是不够的。

但是,如果将数组的元素设置为 null 意味着某些特殊的东西(例如,当使用 null 终止字符串时),则将第一个元素设置为 null 可能就足够了。这样,数组的任何用户都会明白它是空的,即使数组仍包含内存中的旧字符

评论

0赞 Johann Gerell 3/11/2009
不要使用“memset”来代替可读性:stackoverflow.com/questions/453432/......
12赞 Sandy 4/1/2009 #9

用:

memset(my_custom_data, 0, sizeof(my_custom_data));

艺术

memset(my_custom_data, 0, strlen(my_custom_data));

评论

2赞 brewmanz 5/12/2018
第二个选项 () 将只清除到第一个“\0”,它可能超出数组的末尾。这可能是可以的,也可能不是。memset(my_custom_data, 0, strlen(my_custom_data));
0赞 theGtknerd 2/16/2021
在我尝试了很多其他方法之后,第一个选项在 ESP32 上运行良好。
1赞 Bryan 7/1/2009 #10

将第一个元素设置为 NULL。打印 char 数组不会给你任何回报。

10赞 Cristian Altamirano 12/11/2010 #11

请尝试以下代码:

void clean(char *var) {
    int i = 0;
    while(var[i] != '\0') {
        var[i] = '\0';
        i++;
    }
}

评论

2赞 user229044 12/11/2010
仅供参考 - 将代码缩进 4 个空格或选择它并点击“代码”按钮,该按钮看起来像两行二进制文件。
0赞 Akash Agarwal 8/9/2018
如果您不想为 memset() 包含 string.h,这是一个很好的解决方案。
-4赞 Greg Grady 11/23/2011 #12

请尝试以下操作:

strcpy(my_custom_data,"");
6赞 Akaanthan Ccoder 3/12/2012 #13

请在下面找到我在案例 1 和案例 2 之后用数组中的数据解释的地方。

char sc_ArrData[ 100 ];
strcpy(sc_ArrData,"Hai" );

案例一:

sc_ArrData[0] = '\0';

结果:

-   "sc_ArrData"
[0] 0 ''
[1] 97 'a'
[2] 105 'i'
[3] 0 ''

案例二:

memset(&sc_ArrData[0], 0, sizeof(sc_ArrData));

结果:

-   "sc_ArrData"
[0] 0 ''
[1] 0 ''
[2] 0 ''
[3] 0 ''

尽管将第一个参数设置为 NULL 就可以了,但建议使用 memset

1赞 codeconnundrum 8/16/2012 #14

以下情况如何:

bzero(my_custom_data,40);
-3赞 wolf 11/16/2013 #15
void clearArray (char *input[]){
    *input = ' '; 
}

评论

1赞 sfelber 9/18/2014
这不是 CLEARING,它只是将第一个字符设置为 ' '!我想你想写 *input = '\0'
5赞 Jevgenij Kononov 1/19/2018 #16

我通常就是这样做的:

memset(bufferar, '\0', sizeof(bufferar));