c++之解決char轉string時出現的亂碼問題
c++ char轉string時出現的亂碼問題
刷題遇到的問題。大致是這樣,需要將一個字符串提取中間一部分,然后轉為整形,通過整形轉化為字符型,最后返回一個字符串。
若是用
char c ; string s = &c;
則會出現亂碼,內容為字符串s加上亂碼。
最后發(fā)現原因是: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 * 出現亂碼 內存共用問題
系統(tǒng):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;
打?。?/p>
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());
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C++中template方法undefined reference to的問題解決
Undefined reference to 錯誤:這類錯誤是在連接過程中出現的,本文就來介紹一下C++中template方法undefined reference to的問題解決,具有一定的參考價值,感興趣的可以了解一下2024-03-03C++?使用getline()從文件中讀取一行字符串方法示例
這篇文章主要介紹了C++?使用getline()從文件中讀取一行字符串方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09