C++字符串问题,为什么输出是乱码?

#include<iostream>#include<string>usingnamespacestd;char*func(char*a);intmain(){print... #include <iostream>
#include <string>
using namespace std;
char* func( char* a );
int main()
{
printf("abc,123,efg,456\n");
printf("%s\n", func("abc,123,efg,456"));
cout<<func("abc,123,efg,456")<<endl;
system("pause");
return 0;
}
char* func( char* a )
{
char p[50];
memset( p, 0, 50*sizeof(char) );
strcpy(p, a);
return p;
}
我在return p; 设置过断点,复制字符串没问题,但输出的是乱码。请教为什么?
展开
 我来答
传薪网络
2015-10-25 · TA获得超过1355个赞
知道小有建树答主
回答量:635
采纳率:92%
帮助的人:242万
展开全部
你想将字符串a保存到字符串p中,然后再输出
但是这样是不行的,因为p是一个栈上面的变量
函数结束后,里面的内容就无法预知了(或者说是无效的了)
根本不能作为返回值使用

你无法将局部变量作为返回值使用,因为局部变量在栈上,函数结束即会被销毁
正确的做法应该是这样:
1 在堆上面分配内存,而不是使用局部变量
int len = strlen(a)+1;
char*p=new char[len];

memset(p,0,len);
strcpy(p,a);
return p;
记得外面获取到p之后,要释放内存
char* p=func("xxx");
cout<<p<<endl;
delete[]p;
或者采用这种方式
2 字符串缓冲区从外面传递进来
char* func(char*a,char*p)
{
strcpy(p,a);

return p;
}
用的时候这样
char p[50]="";
cout<<func(a,p)<<endl;
甫哲妍5r
2012-01-27 · TA获得超过192个赞
知道小有建树答主
回答量:174
采纳率:0%
帮助的人:156万
展开全部
你在堆上申请了一个char p[50];然而出了char* func( char* a )这个函数就自动释放掉了 也就是说你的P并没有带出去值 你定义一个指针然后在堆上new或者malloc 然后在没用的时候再delete或者free掉即可。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
miniappdGlI9NdxDrHlA
2012-01-27 · TA获得超过1521个赞
知道小有建树答主
回答量:431
采纳率:0%
帮助的人:485万
展开全部
你返回局部栈的内容当然不行,函数里面你定义了一个局部变量,返回后,指针就失效,指向内容就是错误空间,当然成了乱码
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
淦海瑶s1
2012-01-27 · TA获得超过3646个赞
知道大有可为答主
回答量:3341
采纳率:100%
帮助的人:757万
展开全部
char* func( char* a );

printf("%s\n", func("abc,123,efg,456"));
cout<<func("abc,123,efg,456")<<endl;

你的声明子函数和调用子函数的时候,参数不对应把,
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式