我以为将第一个元素设置为null会清空char数组的所有内容。
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
然而,这只将第一个元素设置为null。
或者
my_custom_data[0] = 0;
我认为,与其使用 memset
,上面两个示例清除所有数据的做法更好。
我以为将第一个元素设置为null会清空char数组的所有内容。
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
然而,这只将第一个元素设置为null。
或者
my_custom_data[0] = 0;
我认为,与其使用 memset
,上面两个示例清除所有数据的做法更好。
这取决于你想如何查看数组。如果你将数组视为一系列字符,则清除数据的唯一方法是触碰每个条目。memset
可能是实现此目的最有效的方式。
另一方面,如果您选择将其视为C/C++空终止字符串,将第一个字节设置为0将有效地清除该字符串。
fprintf
打印字符数组,它会打印到空指针为止吗?还是会打印数组中剩下的垃圾数据? - SSH Thismy_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);
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
- Someone Somewherememset(arr, 0, sizeof(arr));
呢? - ratojakufchar 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));
memset(my_custom_data, 0, strlen(my_custom_data));
)只会清除到第一个'\0',这可能超出数组的末尾。这可能是可以接受的,也可能不可以。 - brewmanz试试以下代码:
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 ''
我通常就像这样做:
memset(bufferar, '\0', sizeof(bufferar));
不对。你所做的只是将第一个值设置为 '\0' 或 0。
如果你正在使用以 null 结尾的字符串,则在第一个示例中,你将获得模拟预期行为的结果,但是内存仍然被设置了。
如果想要清除内存而不使用 memset,请使用循环语句。