清除char数组c

ant*_*009 101 c arrays char

我认为通过将第一个元素设置为null将清除char数组的整个内容.

char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
Run Code Online (Sandbox Code Playgroud)

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

要么

my_custom_data[0] = 0; 
Run Code Online (Sandbox Code Playgroud)

而不是使用memset,我认为上面的两个例子应该清除所有的数据.

Jar*_*Par 110

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

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

  • 他们在答案中的关键词是"有效".只有第一个元素开始设置为0,其余元素仍然具有未定义的值,但如果您将数组视为空终止字符串并且第一个元素为null,则该字符串被视为空. (4认同)

Joh*_*lla 69

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

如果要清除数组的所有元素,则必须访问每个元素.这就是memset:

memset(&arr[0], 0, sizeof(arr));
Run Code Online (Sandbox Code Playgroud)

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

char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);
Run Code Online (Sandbox Code Playgroud)

  • 我相信第二个版本应该是: std::fill( arr, arr+ sizeof(arr)/sizeof(arr[0]), 0 ); (2认同)

abe*_*nky 22

为什么你认为设置一个元素会清除整个数组?特别是在没有程序员明确编程的情况下,很少发生过.如果您将第一个元素设置为零(或任何值),那么您已完成此操作,仅此而已.

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

char mcd[40] = {0}; /* sets the whole array */
Run Code Online (Sandbox Code Playgroud)

否则,我不知道除memset之外的任何技术,或类似的东西.


小智 10

使用:

memset(my_custom_data, 0, sizeof(my_custom_data));
Run Code Online (Sandbox Code Playgroud)

要么:

memset(my_custom_data, 0, strlen(my_custom_data));
Run Code Online (Sandbox Code Playgroud)

  • 第二个选项 (`memset(my_custom_data, 0, strlen(my_custom_data));`) 只会清除第一个 '\0',它可能超出数组的末尾。这可能没问题,也可能没问题。 (2认同)

小智 9

请尝试以下代码:

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

  • FYI - 用4个空格缩进代码或选择它并点击"代码"按钮,它看起来像两行二进制. (2认同)

Joh*_*ker 7

为什么不用memset()?这是怎么做的.

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

  • 那么你的答案是什么? (2认同)

AKN*_*AKN 6

请在案例1和案例2之后找到我在数组中解释的数据.

char sc_ArrData[ 100 ];
strcpy(sc_ArrData,"Hai" );
Run Code Online (Sandbox Code Playgroud)

情况1:

sc_ArrData[0] = '\0';
Run Code Online (Sandbox Code Playgroud)

结果:

-   "sc_ArrData"
[0] 0 ''
[1] 97 'a'
[2] 105 'i'
[3] 0 ''
Run Code Online (Sandbox Code Playgroud)

案例2:

memset(&sc_ArrData[0], 0, sizeof(sc_ArrData));
Run Code Online (Sandbox Code Playgroud)

结果:

-   "sc_ArrData"
[0] 0 ''
[1] 0 ''
[2] 0 ''
[3] 0 ''
Run Code Online (Sandbox Code Playgroud)

虽然将第一个参数设置为NULL可以解决问题,但建议使用memset


Jev*_*nov 5

我通常只是这样做:

memset(bufferar, '\0', sizeof(bufferar));
Run Code Online (Sandbox Code Playgroud)