清除 char 数组 c

Posted

技术标签:

【中文标题】清除 char 数组 c【英文标题】:clearing a char array c 【发布时间】:2010-10-12 13:58:42 【问题描述】:

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

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

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

my_custom_data[0] = 0; 

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

【问题讨论】:

Jared,你为什么要设置 c++ 标签?他谈到了“C”,并没有添加任何与C++相关的标签。 这同样适用于 C++ 中的字符数组,即使他没有指定。 我删除了 C++ 标签以避免我们已经看到人们提供 C++ 特定解决方案 【参考方案1】:

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

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

【讨论】:

答案中的关键词是“有效”。只有第一个元素开始设置为 0,其余元素仍然具有未定义的值,但如果您将数组视为以 null 结尾的字符串且第一个元素为 null,则该字符串被视为空。 确实,这就是答案。 @caparcode,完全正确。这就是为什么了解数组的使用方式非常重要的原因。 是的,这就是我在第一篇文章中应该说的。 char 是终止的字符串。所以这些都可以做到这一点。字符[0] = '\0';或 char[0] = 0。我不确定,但我听说使用 '\0' 更适合使用以空字符结尾的字符串。 @robUK,是的,你是对的。从技术上讲 '\0' 等于 0(在 ascii 中),但你应该使用 '\0' 因为它让你的意图清晰【参考方案2】:

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);

【讨论】:

我认为第二个版本应该是:std::fill(arr, arr+ sizeof(arr)/sizeof(arr[0]), 0 ); 澄清:不要将 sizeof 与 fill 一起使用,因为您稍后会遇到 int、long、double 或其他数组的麻烦。 我更喜欢:std::fill(&arr[0], &arr[arr_len], 0); Zan Lynx,这是未定义的行为。你不能做 &arr[arr_len]。但你必须做 std::fill(arr, arr + sizeof arr, 0);或者如果你有长度 std::fill(arr, arr + arr_len, 0);假设一个字符数组 仅在 C 中有效。虽然问题明确针对 C(另一个人添加了 C++ 标签,我不知道为什么),但 std::fill 显示了 C++ 亲和力:)【参考方案3】:

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

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

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

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

【讨论】:

我猜这取决于你使用的编译器 @cocoafan:不,它不依赖于编译器。它是语言规范的一部分。任何行为不同的编译器都不遵循 C 语言。 我不知道,谢谢。我找不到任何可以阅读这种特殊情况的资源。把它当做书签就好了。 称为部分初始化。我没有 C99 规范,但这里有两个来源:bit.ly/enBC2m“您不需要初始化数组中的所有元素。如果数组被部分初始化,则未初始化的元素会收到相应的值 0类型。” bit.ly/f9asHH "如果初始化器的数量少于数组中的元素,则剩余元素自动初始化为0" 这不适用于已经声明并赋值的数组吗?【参考方案4】:

用途:

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

或者:

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

【讨论】:

第二个选项 (memset(my_custom_data, 0, strlen(my_custom_data));) 只会清除到第一个 '\0',它可能超出数组的末尾。这可能会,也可能不会。 在我尝试了很多其他方法之后,第一个选项在 ESP32 上运行良好。【参考方案5】:

试试下面的代码:

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

【讨论】:

仅供参考 - 将代码缩进 4 个空格或选择它并点击“代码”按钮,它看起来像两行二进制文件。 如果您不想将 string.h 包含在 memset() 中,这是一个很好的解决方案。【参考方案6】:

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

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

【讨论】:

不要使用 memset 超过可读性:***.com/questions/453432/… 那你的答案是什么?【参考方案7】:

请在下面找到我在案例 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 ''

案例2:

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

结果:

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

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

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

我对 for 循环说不。尽量不要编写自己的“改进”(通常不是)库函数。事实上,memset 和 memcpy 相当特殊,通常根据已知的数据对齐和长度内联到 CPU 的自定义机器代码中。 @Zan OP 不想使用 memset(也许他是嵌入的并且没有可用的)。但是,是的,memset 通常是高度优化的,并且可能比 for 循环更快。 不错,不过他不想用memset,所以我建议用for循环。【参考方案9】:

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

【讨论】:

memset 不应该在可读性上被使用:***.com/questions/453432/…【参考方案10】:

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

【讨论】:

【参考方案11】:

我通常只是这样做:

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

【讨论】:

【参考方案12】:

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

你发现的不正确

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

没错!

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

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

【讨论】:

不要使用“memset”超过可读性:***.com/questions/453432/…【参考方案13】:

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

【讨论】:

【参考方案14】:

以下内容如何:

bzero(my_custom_data,40);

【讨论】:

【参考方案15】:
void clearArray (char *input[])
    *input = ' '; 

【讨论】:

这不是CLEARING,它只是将第一个字符设置为''!我想你想写 *input = '\0'【参考方案16】:

尝试以下方法:

strcpy(my_custom_data,"");

【讨论】:

以上是关于清除 char 数组 c的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 memset 清除 char 数组 [重复]

如何从 char 数组中清除单个字符?

清除 char 数组的最佳方案 - memset 与否?

在 C++ 上的函数 gets() 后,字符数组被清除

C语言中char数组与char指针问题

C语言 char型数组拼接问题