113

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

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

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

或者

my_custom_data[0] = 0; 

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

4

16 回答 16

122

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

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

于 2009-03-11T00:33:44.793 回答
77

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);
于 2009-03-11T00:34:25.340 回答
26

为什么您认为设置单个元素会清除整个数组?尤其是在 C 中,如果没有程序员明确地编程,几乎不会发生任何事情。如果您将第一个元素设置为零(或任何值),那么您已经完成了该操作,仅此而已。

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

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

否则,除了 memset 或类似的东西,我不知道任何技术。

于 2009-03-11T00:35:08.643 回答
12

采用:

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

或者:

memset(my_custom_data, 0, strlen(my_custom_data));
于 2009-03-31T16:31:08.633 回答
10

试试下面的代码:

void clean(char *var) {
    int i = 0;
    while(var[i] != '\0') {
        var[i] = '\0';
        i++;
    }
}
于 2010-12-10T20:09:43.857 回答
7

为什么不使用memset()?这就是如何做到这一点。

设置第一个元素不会影响其余的内存,但 str 函数会将数据视为空。

于 2009-03-11T00:34:53.467 回答
6

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

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

情况1:

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

于 2012-03-12T10:20:09.457 回答
4

没有。您所做的只是将第一个值设置为 '\0' 或 0。

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

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

于 2009-03-11T00:34:01.393 回答
2

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

于 2009-03-11T00:33:21.783 回答
2

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

于 2009-03-11T00:34:20.270 回答
2

我通常只是这样做:

memset(bufferar, '\0', sizeof(bufferar));
于 2018-01-19T13:09:33.323 回答
1

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

正如您发现的那样,这不正确

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

确切地!

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

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

于 2009-03-11T00:35:59.250 回答
1

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

于 2009-06-30T23:34:19.570 回答
1

以下情况如何:

bzero(my_custom_data,40);
于 2012-08-16T11:49:12.007 回答
-3
void clearArray (char *input[]){
    *input = ' '; 
}
于 2013-11-16T03:44:03.770 回答
-4

尝试以下操作:

strcpy(my_custom_data,"");
于 2011-11-23T04:17:41.017 回答