c++之解决char转string时出现的乱码问题
作者:u010905359
这篇文章主要介绍了c++之解决char转string时出现的乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
c++ char转string时出现的乱码问题
刷题遇到的问题。大致是这样,需要将一个字符串提取中间一部分,然后转为整形,通过整形转化为字符型,最后返回一个字符串。
若是用
char c ; string s = &c;
则会出现乱码,内容为字符串s加上乱码。
最后发现原因是:char没有’\0’作为字符串的边界,当输出string时,string可以看成是数组,因为string接受一个地址,那必然是首地址,但string长度并非是1,所以后面的空间并未初始化,则会出现乱码。
string本身就是一个数据结构。
可以通过at来获取内容,即s.at[0].
告知:
当我们用
char c ; string s = &c; cout<<s.length();`
结果是16
而
char c ; string s; s = &c; cout<<s.length();
结果会是12
可以思考下原因。
另一种做法是尝试用char*或char[]来保存变量,此时用string接收不会出现乱码。
另补充冷知识:sizeof(string) = 28;
c++ string 转 char * 出现乱码 内存共用问题
系统:unbuntu16.04 IDE:vscode
出现乱码
std::string str = "Hello Word"; char* p1 = str.c_str(); //出现乱码 char* p2 = str.data(); //出现乱码
出现内存共用
后面的字符串会覆盖之前的:
char * s1 = (char *)data.getWorkNum().c_str(); //string是 s1:1 std::cout<<s1<<std::endl; char * s2 = (char *)data.getName().c_str(); //string是 s2:11 std::cout<<s2<<std::endl; char * s3 = (char *)data.getDepartment().c_str(); //string是 s3:111 std::cout<<s3<<std::endl; char * s4 = (char *)data.getRoom().c_str(); //string是 s4:1111 std::cout<<s4<<std::endl; std::cout<<s1<<std::endl; std::cout<<s2<<std::endl; std::cout<<s3<<std::endl; std::cout<<s4<<std::endl;
打印:
s1:1
s2:11
s3:111
s4:1111
s4:1111 //出现后者覆盖前面所有
s4:1111 //出现后者覆盖前面所有
s4:1111 //出现后者覆盖前面所有
s4:1111 //出现后者覆盖前面所有
解决方法
(1):
char * strc = new char[strlen(str.c_str())+1]; strcpy(strc, str.c_str());
(2):
char c_workNum[data.getWorkNum().length()]; //其中data.getWorkNum()为字符串 strcpy(c_workNum,data.getWorkNum().c_str());
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。