怎么用memset清空字符数组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用memset清空字符数组?相关的知识,希望对你有一定的参考价值。
假如a[]="I love China",如何用menset来清空a 。 (是清空不是清零) 是用:memset(a, 0, sizeof(a)); 还是:memset(a, '\0', sizeof(a)); 还有a[0]='\0' ,可以清空a吗? 谢谢!
参考技术A 用memset(a,0,strlen(a));//strlen(a)检测字符串长度
a[0]='\0';
不能清空,仅是把第0个元素置为'\0',用printf输出为空而已。 参考技术B 所谓清空数组,是要清空每个元素;清空字符串是将字符串置为空,这两个要求有异。
清空数组:char
a[100];
int
i;
for
(
i=0;i<100;i++
)
a[i]=0;
清空字符串:char
a[100];
a[0]=0;
//或a[0]='\0';
因为字符串以0结束,你只要将字符串数组第1个字符设置为0值即算清空了字符串。
存放字符串的
字符数组
就是你说的字符串数组,只不过说明这个字符型数组是用于存放字符串的而已,官方可没有这个说法,只要字符型数组一说。 参考技术C memset是设置内存的值,memset(a,
0,
sizeof(a))就是将数组a的每个位置都设置为0,相当于循环的a[i]='0',memset(a,
'\0',
sizeof(a))可以算是清空,因为所有的c字符串都是以'\0'结尾的,设置成了'\0'也就相当于清空了。
a[0]='\0'可以清空a,你可以设置后,调用strlen(a)看看长度是多少啊
拒绝手滑,我们都是稳准狠C++のmemset函数的小探究
引子
我们使用经常使用memset函数来初始化一些数据结构,常见的字符串数组、结构体、结构体数组。今天我要提出的是一个关于指针的初始化的小问题,很容易手滑写错了。
强调一下错误示例,直接用指针来memset是不对的,并不能清空指针:
void* p1 = &x;memset(p1, 0, sizeof(p1));
所以我们为了避免memset手滑导致的错误,经常会自己封装一下memset函数,如“mzero(a)”宏所示,方便大家准确地使用。
使用memset函数清空指针的demo如下:
code:
#include <iostream>
#include <cstring>
using namespace std;
//定义赋初值为0
#define mzero( a ) \\
{ \\
memset( &a, 0x00, sizeof(a)); \\
}
int main() {
int x=10;
void* pNull = NULL;
cout << "NULL ptr is:" << pNull << endl;
cout << "x ptr is :" << &x << endl;
cout << endl;
void* p1 = &x;
cout << "p1 ptr is:" << p1 << endl;
memset(p1, 0, sizeof(p1));
cout << "memset p : " << p1 << endl;
cout << endl;
void* p2 = &x;
cout << "p2 ptr is:" << p2 << endl;
memset(&p2, 0, sizeof(p2));
cout << "memset &p ptr: " << p2 << endl;
cout << endl;
void* p3 = &x;
cout << "p3 ptr is:" << p3 << endl;
mzero(p3);
cout << "mzero p: " << p3 << endl;
}
output:
NULL ptr is:0
x ptr is :0x7fff671fb2d4
p1 ptr is:0x7fff671fb2d4
memset p : 0x7fff671fb2d4
p2 ptr is:0x7fff671fb2d4
memset &p ptr: 0
p3 ptr is:0x7fff671fb2d4
mzero p: 0
正文
其实以上问题已经转化为memset初始化指针问题了。首先给出结论:
指针使用NULL赋值,值数据使用memset设为0。
虽然我们demo里memset方法和NULL方法从结果上看都初始化为0了,但是还是不建议使用memset来初始化指针。因为有些系统存在着“非零空指针”(某些 Honeywell-Bull 大型机使用比特模式 06000 作为 (内部的) 空指针),这时memset就不适用这种情况了。所以我们应该:
• 用空指针常量(或空指针)对指针变量初始化;
例如:int *p = NULL; int *p = 0;
• 用空指针常量(或空指针)对指针变量赋值;
例如:int i =222;int *p = &i;
官方文献
追根溯源,打破沙锅问到底。
memset
void * memset ( void * ptr, int value, size_t num );
Fill block of memory
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).
Parameters
ptr:
Pointer to the block of memory to fill.
value:
Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.
num:
Number of bytes to be set to the value.
size_t is an unsigned integral type.
Return Value
ptr is returned.
旁征博引
https://www.cplusplus.com/reference/cstring/memset/
https://www.maixj.net/ict/memset-24260
http://c-faq-chn.sourceforge.net/ccfaq/node73.html
以上是关于怎么用memset清空字符数组?的主要内容,如果未能解决你的问题,请参考以下文章