清除 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的主要内容,如果未能解决你的问题,请参考以下文章