strcpy函数的困惑?

xinustc 2008-12-01 10:09:55
char m[]="hell";
char *a;
char *c=new char();
strcpy(a,m);
cout<<sizeof(a)<<" "<<strlen(a);

输出结果居然都是4 怎么没有算'\0'啊?怎么看他的源码呢?

我在网上查,说实现是如下代码:

char * strcopy(char * to,const char *from)
{
assert((from!=NULL)&&(to!=NULL));

while((*to++=*from++)!='\0')

return to;


}
明显不是这样的,上面的函数要求目的串已分配空间才可进行copy

我自己写了一个但是奇怪的是,最后输出结果居然也是4.....另外有两个问题,请指教

代码如下:



char * strcopy(char * &to,const char *from)
{
assert((from!=NULL)&&(to!=NULL));
delete []to; //问题1:这样写对吗?因为不知道to指向的是单个字符还是字符数组,还有未初始化的指针应该怎么处理?

to=new char [strlen(from)+1] ; //问题2:这里目标数组大小明明是5啊 main调用了就变成4了 为什么?
char *des=to;
while((*des++=*from++)!='\0');

return to;


}


...全文
164 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程黑板报 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gordyyoung 的回复:]
strlen本来就不算'\0'字符长度的。
[/Quote]
up
编程黑板报 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gordyyoung 的回复:]
strlen本来就不算'\0'字符长度的。
[/Quote]
up
Laozql 2008-12-02
  • 打赏
  • 举报
回复
strlen()返回的是真实长度,至于a,指针嘛,即使你没它分配空间,它本身就占四个字节的内存,所以sizeof(a)返回4咯!
xinustc 2008-12-02
  • 打赏
  • 举报
回复
我的意思是假设 只在堆上只给a分配了一个空间,然后用strcpy 后a占有了堆里更多的空间 以后new新的空间时会不会把他覆盖?堆里的空间不是必须要new才能用吗?
char *a=new char();
char line[1024]={"........"};
strcpy(a,line);
char *b=new char [1024];
......



另外上面的程序写错了:
char *str(char * to,const char *from)
{
assert((from!=NULL)&&(to!=NULL));
char * des=to;
while((*des++=*from++)!='\0') ;

return to;
}
ARLENE_YANG 2008-12-02
  • 打赏
  • 举报
回复
char m[]="hell";
char *a;
char *c=new char();
strcpy(a,m);
cout < <sizeof(a) < <" " < <strlen(a);

输出结果居然都是4 怎么没有算'\0'啊?怎么看他的源码呢?


sizeof/strlen 本来就不包括结束符'\0'

LZ可以查下书关于字符串章节看一下
xinustc 2008-12-02
  • 打赏
  • 举报
回复
我晕 strlen那个是我糊涂了,我老想着sizeof数组呢,不要回答了,我是想问strcpy函数的实现

楼上几位说在传参数前要分配空间,那么看这个:

char *a;
char m[]="hello";
cout<<strcpy(a,m);

结果照样正确,这不是说明标准的strcpy函数可以做分配空间的工作吗?
once_and_again 2008-12-02
  • 打赏
  • 举报
回复
strncpy 没有\n 结束
strcpy 遇到\n 就结束
是c++之父说的,
condor888 2008-12-02
  • 打赏
  • 举报
回复
楼主在去看看c++ primer里关于这个的知识
condor888 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gordyyoung 的回复:]
strlen本来就不算'\0'字符长度的。
[/Quote]
恩!
jqx_ah 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 whslovexyp 的回复:]
a是指针,长度当然是4。
strlen算到字符串后边的\0,因此strlen也是4
[/Quote]
up
aaajj 2008-12-01
  • 打赏
  • 举报
回复
char m[]="hell"; 
char *a = new char[32];/////////////////////////////
char *c=new char();
strcpy(a,m);
cout < <sizeof(a) < <" " < <strlen(a);

看看你的程序,a 没有分配内存啊;
lc19890326 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xinustc 的回复:]
但是调用标准的strcpy函数 只需要声明char *a;就可以直接使用strcpy啊~~~

[/Quote]
但你运行看看是什么后果 要你自己保证传进去的值
lc19890326 2008-12-01
  • 打赏
  • 举报
回复

//char * strcopy(char * &to,const char *from)
char * strcopy(char * to,const char *from)//上面错了吧,这个才是对的

1.为什么需要你在strcopy中去删除用户传进来的目标串然后再分配呢???使用这个函数的人就应该保证我传进来的目标串是已经分配空间的。
如果你还是想检查指针是否为空的话,你就直接抛出一个异常
2.指针都是32位的~即sizeofz(char*)=4。

看看这个对你有帮助的
http://blog.csdn.net/shizhip/archive/2008/09/23/2967989.aspx
xinustc 2008-12-01
  • 打赏
  • 举报
回复
但是调用标准的strcpy函数 只需要声明char *a;就可以直接使用strcpy啊~~~


[Quote=引用 5 楼 yangkunhenry 的回复:]
C/C++ code

char * strcpy( char *strDest, const char *strSrc )
{
 assert( (strDest != NULL) && (strSrc != NULL) );
 char *address = strDest;
 while( (*strDest++ = * strSrc++) != ‘\0’ );
  return address;
}


这里在使用strcpy前,strDest已经分配了空间了
[/Quote]
gordyyoung 2008-12-01
  • 打赏
  • 举报
回复
strlen本来就不算'\0'字符长度的。
yangkunhenry 2008-12-01
  • 打赏
  • 举报
回复

char * strcpy( char *strDest, const char *strSrc )
{
 assert( (strDest != NULL) && (strSrc != NULL) );
 char *address = strDest;
 while( (*strDest++ = * strSrc++) != ‘\0’ );
  return address;
}

这里在使用strcpy前,strDest已经分配了空间了
xinustc 2008-12-01
  • 打赏
  • 举报
回复
额我....... 那麻烦帮我看下第一个问题吧 还有strcpy函数该怎么实现呢
xinustc 2008-12-01
  • 打赏
  • 举报
回复
晕 我迷糊了 呵呵
whslovexyp 2008-12-01
  • 打赏
  • 举报
回复
a是指针,长度当然是4。
strlen算到字符串后边的\0,因此strlen也是4
healer_kx 2008-12-01
  • 打赏
  • 举报
回复
char*的sizeof就是4.... ....

65,210

社区成员

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

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