怎么用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必须是定义成char a[] = "xxxxxx"这样而不能是char *a = "xxxxxx"。
否则,sizeof(a)后者就是一个指针的大小也就是4了。
a[0] = '\0'只能是在a的第一个字符的位置上写一个0,也就是字符串的结束符而已。
实际上自a[1]开始后面还都是有数据的。
如果从相对意义上说只要控制正确就行,从绝对的“清空”角度不能算清空。
必须使用你写的两个memset才可以。
希望有用。 参考技术A 所谓清空数组,是要清空每个元素;清空字符串是将字符串置为空,这两个要求有异。
清空数组: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值即算清空了字符串。
存放字符串的字符数组就是你说的字符串数组,只不过说明这个字符型数组是用于存放字符串的而已,官方可没有这个说法,只要字符型数组一说。 参考技术B 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(a,0,strlen(a)); //strlen(a)检测字符串长度
a[0]='\0'; 不能清空,仅是把第0个元素置为'\0',用printf输出为空而已。
二维字符数组上的 memset
【中文标题】二维字符数组上的 memset【英文标题】:memset on 2d array of chars 【发布时间】:2012-05-30 22:49:50 【问题描述】:使用 2D 整数数组,一切都很好:
int **p = new int*[8];
for (int i = 0; i < 8; i++)
p[i] = new int[8];
memset(p, 0, 64 * sizeof(int))
但是对于二维字符数组,我得到一个运行时错误
char **p = new char*[8];
for (int i = 0; i < 8; i++)
p[i] = new char[8];
memset(p, 0, 64 * sizeof(char));
我的代码有什么问题?
【问题讨论】:
你需要为每个 p[i] 调用 memset。您无法保证它们在内存中是连续的,并且您不会在不应该写的地方写。 【参考方案1】:我认为两者都可能是错误的,只有第二个在运行时失败。每当您使用new
分配一个数组时,它都会进入堆并返回一个指针。因此,在您的情况下,p
中有 8 个 X 类型的指针。您确实没有有一个 8x8 连续的内存块,而是有 8 个指向 8 个内存块的指针,大小均为 8*sizeof(X)
。
解决方案是为p
中的每个元素调用memset
,或者分配一块内存并使用索引数学来模拟多维访问或我可能缺少的其他技巧。
【讨论】:
【参考方案2】:如果您的数组没有被动态分配,这将起作用:
memset(p, 0, 8 * 8 * sizeof(char[0][0]));
请注意,现在它正在将数组元素的大小传递给sizeof
。
但在您的情况下,解决方案确实是为p
中的每个元素调用 memset:
for (int i = 0; i < 8; i++)
memset(p[i], 0, sizeof(p[i][0]) * 8);
如前所述,另一种解决方案是将p
转换为一维数组。
【讨论】:
以上是关于怎么用memset清空字符数组?的主要内容,如果未能解决你的问题,请参考以下文章