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也是一样,为什么?
...全文
185 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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]();
来者给分吧,哈哈!

65,187

社区成员

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

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