c++之解決char轉(zhuǎn)string時(shí)出現(xiàn)的亂碼問(wèn)題
c++ char轉(zhuǎn)string時(shí)出現(xiàn)的亂碼問(wèn)題
刷題遇到的問(wèn)題。大致是這樣,需要將一個(gè)字符串提取中間一部分,然后轉(zhuǎn)為整形,通過(guò)整形轉(zhuǎn)化為字符型,最后返回一個(gè)字符串。
若是用
char c ; string s = &c;
則會(huì)出現(xiàn)亂碼,內(nèi)容為字符串s加上亂碼。
最后發(fā)現(xiàn)原因是:char沒(méi)有’\0’作為字符串的邊界,當(dāng)輸出string時(shí),string可以看成是數(shù)組,因?yàn)閟tring接受一個(gè)地址,那必然是首地址,但string長(zhǎng)度并非是1,所以后面的空間并未初始化,則會(huì)出現(xiàn)亂碼。
string本身就是一個(gè)數(shù)據(jù)結(jié)構(gòu)。
可以通過(guò)at來(lái)獲取內(nèi)容,即s.at[0].
告知:
當(dāng)我們用
char c ; string s = &c; cout<<s.length();`
結(jié)果是16
而
char c ; string s; s = &c; cout<<s.length();
結(jié)果會(huì)是12
可以思考下原因。
另一種做法是嘗試用char*或char[]來(lái)保存變量,此時(shí)用string接收不會(huì)出現(xiàn)亂碼。
另補(bǔ)充冷知識(shí):sizeof(string) = 28;
c++ string 轉(zhuǎn) char * 出現(xiàn)亂碼 內(nèi)存共用問(wèn)題
系統(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)存共用
后面的字符串會(huì)覆蓋之前的:
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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++中template方法undefined reference to的問(wèn)題解決
Undefined reference to 錯(cuò)誤:這類(lèi)錯(cuò)誤是在連接過(guò)程中出現(xiàn)的,本文就來(lái)介紹一下C++中template方法undefined reference to的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03C++子類(lèi)父類(lèi)成員函數(shù)的覆蓋和隱藏實(shí)例詳解
這篇文章主要介紹了C++子類(lèi)父類(lèi)成員函數(shù)的覆蓋和隱藏實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++?使用getline()從文件中讀取一行字符串方法示例
這篇文章主要介紹了C++?使用getline()從文件中讀取一行字符串方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09關(guān)于C++中構(gòu)造函數(shù)初始化成員列表的總結(jié)
下面小編就為大家?guī)?lái)一篇關(guān)于C++中構(gòu)造函數(shù)初始化成員列表的總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12