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

#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; 设置过断点,复制字符串没问题,但输出的是乱码。请教为什么?

你想将字符串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;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-01-27
你在堆上申请了一个char p[50];然而出了char* func( char* a )这个函数就自动释放掉了 也就是说你的P并没有带出去值 你定义一个指针然后在堆上new或者malloc 然后在没用的时候再delete或者free掉即可。
第2个回答  2012-01-27
你返回局部栈的内容当然不行,函数里面你定义了一个局部变量,返回后,指针就失效,指向内容就是错误空间,当然成了乱码
第3个回答  2012-01-27
char* func( char* a );

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

你的声明子函数和调用子函数的时候,参数不对应把,本回答被网友采纳
相似回答