strncat用在堆上的字符数组会有乱码?

路人甲cw 2011-11-22 05:33:04

输出的字符串开头部分会有乱码,后面正常
int main()
{
const char *s1="abcd";
const char *s2="efgh";
char *cstr=new char[strlen(s1)+strlen(s2)+1];
//char cstr[strlen(s1)+strlen(s2)+1];
strncat(cstr,s1,strlen(s1));
strncat(cstr,s2,strlen(s2));
cout<<cstr<<endl;
delete [] cstr;
return 0;
}
用栈上的数组就正常
int main()
{
const char *s1="abcd";
const char *s2="efgh";
//char *cstr=new char[strlen(s1)+strlen(s2)+1];
char cstr[strlen(s1)+strlen(s2)+1];
strncat(cstr,s1,strlen(s1));
strncat(cstr,s2,strlen(s2));
cout<<cstr<<endl;
//delete [] cstr;
return 0;
}

换strcat也是一样,为什么?
...全文
76 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qscool1987 2011-11-22

jiefen
回复
路人甲cw 2011-11-22
[Quote=引用 10 楼 qq120848369 的回复:]

char cstr[strlen(s1)+strlen(s2)+1];

这能编译过么,蛋疼了。
[/Quote]
确实过了。。。
回复
qq120848369 2011-11-22
char cstr[strlen(s1)+strlen(s2)+1];

这能编译过么,蛋疼了。
回复
qq120848369 2011-11-22
strncat(cstr,s1,strlen(s1));的前提是cstr是'\0'结尾,可是你没有。
回复
没有初始化是个可大可小的问题~~~接分。
回复
路人甲cw 2011-11-22
我确实在拷贝的时候漏了null字符,应该这样写才对:
strncat(cstr,s1,strlen(s1)+1);
strncat(cstr,s2,strlen(s2)+1);
回复
sky_heart_zhang 2011-11-22
[Quote=引用 4 楼 sky_heart_zhang 的回复:]
问题原因:strcat和strncat都是在你指定的目标字符串的末尾添加的(因此如果你的目标字符串没有'\0',就会导致非法内存访问,可能不会出错,但是确实非法内存访问了)。

对于strcat和strncat做一下说明:
strncat拷贝你指定的长度,由于后面你指定的长度不包括'\0',因此strncat之后没有结束符,导致输出有问题。

而strcat则会将源字符串的'\0'也会拷……
[/Quote]

抱歉,有一点说错了,strcat和strncat都会自动将原有字符串的'\0'弄到最后,不会出现没有'\0'的问题。
回复
sky_heart_zhang 2011-11-22
问题原因:strcat和strncat都是在你指定的目标字符串的末尾添加的(因此如果你的目标字符串没有'\0',就会导致非法内存访问,可能不会出错,但是确实非法内存访问了)。

对于strcat和strncat做一下说明:
strncat拷贝你指定的长度,由于后面你指定的长度不包括'\0',因此strncat之后没有结束符,导致输出有问题。

而strcat则会将源字符串的'\0'也会拷贝到目标字符串中。
回复
路人甲cw 2011-11-22
这样也可以,strncat连接的时候就是找左边实参的第一个null字符位置:
*cstr='\0';
回复
路人甲cw 2011-11-22
解决了,原来要初始化:
char *cstr=new char[strlen(s1)+strlen(s2)+1]();
来者给分吧,哈哈!
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告