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());
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
在vs2010中,输出当前文件路径与源文件当前行号的解决方法
本篇文章是对在vs2010中,输出当前文件路径与源文件当前行号的解决方法进行了详细的分析介绍,需要的朋友参考下2013-05-05VSCode插件开发全攻略之跳转到定义、自动补全、悬停提示功能
这篇文章主要介绍了VSCode插件开发全攻略之跳转到定义、自动补全、悬停提示,需要的朋友可以参考下2020-05-05
最新评论