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; 设置过断点,复制字符串没问题,但输出的是乱码。请教为什么? 展开
#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;
但是这样是不行的,因为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;
展开全部
你在堆上申请了一个char p[50];然而出了char* func( char* a )这个函数就自动释放掉了 也就是说你的P并没有带出去值 你定义一个指针然后在堆上new或者malloc 然后在没用的时候再delete或者free掉即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你返回局部栈的内容当然不行,函数里面你定义了一个局部变量,返回后,指针就失效,指向内容就是错误空间,当然成了乱码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char* func( char* a );
printf("%s\n", func("abc,123,efg,456"));
cout<<func("abc,123,efg,456")<<endl;
你的声明子函数和调用子函数的时候,参数不对应把,
printf("%s\n", func("abc,123,efg,456"));
cout<<func("abc,123,efg,456")<<endl;
你的声明子函数和调用子函数的时候,参数不对应把,
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询