我认为通过将第一个元素设置为 null 会清除 char 数组的全部内容。
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
但是,这只会将第一个元素设置为 null。
或者
my_custom_data[0] = 0;
而不是 use memset
,我认为上面的 2 个示例应该清除所有数据。
这取决于您希望如何查看数组。如果您将数组视为一系列字符,那么清除数据的唯一方法是触摸每个条目。memset
可能是实现这一目标的最有效方法。
另一方面,如果您选择将此视为 C/C++ 空终止字符串,则将第一个字节设置为 0 将有效地清除该字符串。
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);
为什么您认为设置单个元素会清除整个数组?尤其是在 C 中,如果没有程序员明确地编程,几乎不会发生任何事情。如果您将第一个元素设置为零(或任何值),那么您已经完成了该操作,仅此而已。
初始化时,您可以将数组设置为零:
char mcd[40] = {0}; /* sets the whole array */
否则,除了 memset 或类似的东西,我不知道任何技术。
采用:
memset(my_custom_data, 0, sizeof(my_custom_data));
或者:
memset(my_custom_data, 0, strlen(my_custom_data));
试试下面的代码:
void clean(char *var) {
int i = 0;
while(var[i] != '\0') {
var[i] = '\0';
i++;
}
}
为什么不使用memset()
?这就是如何做到这一点。
设置第一个元素不会影响其余的内存,但 str 函数会将数据视为空。
请在下面找到我在案例 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
没有。您所做的只是将第一个值设置为 '\0' 或 0。
如果您正在使用以空字符结尾的字符串,那么在第一个示例中,您将获得模仿您所期望的行为,但是仍然设置了内存。
如果要在不使用 memset 的情况下清除内存,请使用 for 循环。
你应该使用 memset。只设置第一个元素是行不通的,你需要设置所有元素 - 如果没有,你怎么能只设置第一个元素为 0?
将空字符写入第一个字符就是这样做的。如果将其视为字符串,则遵循空终止字符的代码会将其视为空字符串,但这与清除数据不同。如果你想真正清除数据,你需要使用 memset。
我通常只是这样做:
memset(bufferar, '\0', sizeof(bufferar));
我认为通过将第一个元素设置为 null 会清除 char 数组的全部内容。
正如您发现的那样,这不正确
但是,这只会将第一个元素设置为 null。
确切地!
您需要使用 memset 清除所有数据,将其中一个条目设置为 null 是不够的。
但是,如果将数组的一个元素设置为 null 意味着一些特殊的事情(例如,当使用 null 终止字符串时),将第一个元素设置为 null 可能就足够了。这样,即使数组仍然包含内存中的旧字符,数组的任何用户都会明白它是空的
将第一个元素设置为 NULL。打印 char 数组不会给你任何回报。
以下情况如何:
bzero(my_custom_data,40);
void clearArray (char *input[]){
*input = ' ';
}
尝试以下操作:
strcpy(my_custom_data,"");