C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > c++ char转string时出现的乱码问题

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()); 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文