在线等怎么把char a[10]="abc"中的a[10]字符串清空,就是a[10]里面一个字符也没有装?

ynchngl1840 2005-09-10 10:42:03
在线等怎么把char a[10]="abc"中的a[10]字符串清空,就是a[10]里面一个字符也没有装?
...全文
1051 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
joymouse 2005-09-11
  • 打赏
  • 举报
回复
初始化的时候可以:char a[10]={0};
运行的时候只能:memset(a, 0, sizeof(a));
dearlee_01 2005-09-11
  • 打赏
  • 举报
回复
方法1:
for(int i = 0, i< 10 ,i++) {
a[i] = 0;
}
方法2:
memset(a, 0, sizeof(a));

方法3:
a = "/0";
xiaocai0001 2005-09-11
  • 打赏
  • 举报
回复
To: mayax(又长又今)
你怎么这么抬杠呢?
我不是说了么
memset( a , 0 , sizeof(char) * 10 );
这种写法,若a是数组则没有问题,若a是指向数组的指针则有问题了。

char b[2];
char c[2];
char * a = b;
memset(a,0,sizeof(a));
------------------
你看你这儿的a是指针还是数组?????
看好了再说不行???
v41dugu 2005-09-11
  • 打赏
  • 举报
回复
我来说一下
如果这个数组是作为字符串的作用 也就是进行整个数组的操作 当然用加'\0'作结束标志也就算是清空了 后面的元素是如何的根本不重要
但是在有的情况下 字符数组也可能对每个元素单独操作。这种情况下如果要清空数组就要把每个元素都设为’\0‘ 就可以用menset这个函数了 用法就想上面的说的。
xiaocai0001 2005-09-11
  • 打赏
  • 举报
回复
To: mayax(mayax)

--------
memset( a , 0 , sizeof(char) * 10 );
这种写法,若a是数组则没有问题,若a是指向数组的指针则有问题了。
antter 2005-09-11
  • 打赏
  • 举报
回复
to mayax(又长又今)
我的自然是比你要牵强,我举这例子的目的并不是阐明我的观点,而是说明你的牵强。你强行引入了一个指针,抛离了楼主字符串数组char[]的前提,强加了一个越界的错误,我也可以引入了一个无效的指针,强加一个无效指针的错误。

我们知道char[]的大小已知的,换句话说你仅仅存在一个 char a[];是不成立的,对已知大小的数组用sizeof(a)取得大小是很厚道的。memset(a,0,sizeof(a))是常用的,有效的,全面的数组清空,对应了楼主要求的"就是a[10]里面一个字符也没有装"。

而a[0]='\0'始得字符串开始符为结束符也是一个行之有效的方法,因为是字符串,在面对字符串的操作中我也建议使用这种方法,但是数据并没清除。

如有字符串a[]="abc";
a[0]='\0';
后来又有操作
a[0]='1';
a[1]='2';
a则变成了"12c";

而memset(a,0,sizeof(a))后
a则变成了"12";
cqpp 2005-09-11
  • 打赏
  • 举报
回复
sizeof是编译时候就决定了的吧!a是指针的话那sizeof(a) 为sizeof(char *) == 4吧!
russilong 2005-09-11
  • 打赏
  • 举报
回复
我编辑了一下,如果考虑最一般的情况,memset(a,0,sizeof(char)*10),memset(a,0,sizeof(a))都没问题,无论a士数组还是指针。
xinxiakk 2005-09-11
  • 打赏
  • 举报
回复
我说过了,最后一个参数是个数,number,和什么类型没关系
mayax 2005-09-11
  • 打赏
  • 举报
回复
antter(JiangMiao|www.sssdf.com)

那既然我的例子牵强的话,前面那个证明我的代码有问题的前提不就更牵强吗?

况且 char * a = NULL; 的情况可以通过一句 if( a ) 来解决。

那可能你又会说 a 可能指向一个非法空间。

那么最完美的结果可能就是

if( a )
{
try { a[0] = 0; }
catch(...){ abort(); }
}

这个问题的核心还只是讨论如何清空字符串而已,实际上把第一个字符设成 '\0' 足以,因为没有设立任何字符串大小的前提。

xinxiakk(特亚)

如果是 wchar_t 而不是 char 呢?

我认为写多一句 sizeof 不会花太多的时间,但对写程序养成严谨的习惯是有好处的。
xinxiakk 2005-09-11
  • 打赏
  • 举报
回复
我首先说一下,关于一些基本知识,
char a[10]="abc";
这个是定义了一个字符串数组,其中a[0]='a',a[1]='b',a[2]='c',后面的从a[3]-a[9]都没有值,我用VC6 显示时什么都没有显示。
你想清空这个字符串,用memset这个函数很好,但是上面的几位用法有问题,memset最后的一个参数应该是你想设置这个字符的个数,注意是一个number,和内存大小,机器位数没关系,直接设置就行了,和sizeof没任何联系。MSDN上对memset最后一个参数的说明是Number of characters 。
以下程序可以说明你要的结果,运行环境是WindowsXP ,VC6。已通过编译,并且可以运行。

#include<iostream>
#include<string.h>
using namespace std;

char a[10]="abc";
void main()
{
cout<<a[0]<<'\n'<<a[1]<<'\n'<<a[2]<<endl;
cout<<sizeof(a)<<endl;
cout<<sizeof(char)*10<<endl;
memset(a,0,10);
cout<<a[0]<<'\n'<<a[1]<<'\n'<<a[2]<<endl;
}

运行结果为:
a
b
c
10
10


//注意,这个地方输出为3行空
press any key to continue


antter 2005-09-11
  • 打赏
  • 举报
回复
= - 我怎么会写memcpy了。
antter 2005-09-11
  • 打赏
  • 举报
回复
楼上有点牵强

就如同类似用
char* a=NULL;
a[0]=0;
证明a[0]=0不行一样
如果是字符串这样算是清空,但如果是字符数组呢?a[1]还是原来的a[1]。
mayax 2005-09-11
  • 打赏
  • 举报
回复
xiaocai0001(萧筱雨) :

那 memset(a,0,sizeof(a)); 这种写法难道就没问题了吗?

而且


char b[2];
char c[2];
char * a = b;
memset(a,0,sizeof(a));

这样的问题恐怕更大吧,连 c 的空间都改写了。


建议还是直接 a[0] = 0;
megaboy 2005-09-10
  • 打赏
  • 举报
回复
使用memset就行了:

memset(a, 0, sizeof(a));
mayax 2005-09-10
  • 打赏
  • 举报
回复
xiaocai0001(萧筱雨)

你的有问题,应该是

memset( a , 0 , sizeof(char) * 10 );

mayax 2005-09-10
  • 打赏
  • 举报
回复

a[0] = 0;

最快速的清空。

xiaocai0001 2005-09-10
  • 打赏
  • 举报
回复
建议用 memset(a,0,sizeof(a));
antter 2005-09-10
  • 打赏
  • 举报
回复
如果a是字符串则 a[0]='\x0';
如果a是字符组则 memcpy(a,0,sizeof(a));

--------
www.sssdf.com/forum 成长中的交流中心,等待您的参于。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧