c++之解決char轉(zhuǎn)string時出現(xiàn)的亂碼問題
c++ char轉(zhuǎn)string時出現(xiàn)的亂碼問題
刷題遇到的問題。大致是這樣,需要將一個字符串提取中間一部分,然后轉(zhuǎn)為整形,通過整形轉(zhuǎn)化為字符型,最后返回一個字符串。
若是用
char c ; string s = &c;
則會出現(xiàn)亂碼,內(nèi)容為字符串s加上亂碼。
最后發(fā)現(xiàn)原因是:char沒有’\0’作為字符串的邊界,當輸出string時,string可以看成是數(shù)組,因為string接受一個地址,那必然是首地址,但string長度并非是1,所以后面的空間并未初始化,則會出現(xiàn)亂碼。
string本身就是一個數(shù)據(jù)結(jié)構(gòu)。
可以通過at來獲取內(nèi)容,即s.at[0].
告知:
當我們用
char c ; string s = &c; cout<<s.length();`
結(jié)果是16
而
char c ; string s; s = &c; cout<<s.length();
結(jié)果會是12
可以思考下原因。
另一種做法是嘗試用char*或char[]來保存變量,此時用string接收不會出現(xiàn)亂碼。
另補充冷知識:sizeof(string) = 28;
c++ string 轉(zhuǎn) char * 出現(xiàn)亂碼 內(nèi)存共用問題
系統(tǒng):unbuntu16.04 IDE:vscode
出現(xiàn)亂碼
std::string str = "Hello Word"; char* p1 = str.c_str(); //出現(xiàn)亂碼 char* p2 = str.data(); //出現(xiàn)亂碼
出現(xiàn)內(nèi)存共用
后面的字符串會覆蓋之前的:
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;
打?。?/p>
s1:1
s2:11
s3:111
s4:1111
s4:1111 //出現(xiàn)后者覆蓋前面所有
s4:1111 //出現(xiàn)后者覆蓋前面所有
s4:1111 //出現(xiàn)后者覆蓋前面所有
s4:1111 //出現(xiàn)后者覆蓋前面所有
解決方法
(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()); 總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C++?Qt開發(fā)之關聯(lián)容器類使用方法詳解
當我們談論編程中的數(shù)據(jù)結(jié)構(gòu)時,順序容器是不可忽視的一個重要概念,Qt?中提供了豐富的容器類,用于方便地管理和操作數(shù)據(jù),本章我們將主要學習關聯(lián)容器,主要包括?QMap?,QSet和?QHash,感興趣的朋友跟著小編一起來學習吧2023-12-12

