c++如何將一個(gè)char轉(zhuǎn)化為string
c++將一個(gè)char轉(zhuǎn)化為string
const char c = 'a'; //1.使用 string 的構(gòu)造函數(shù) string s(1,c); //2.聲明string 后將char push_back string s1; s1.push_back(c); //3.使用stringstream stringstream ss; ss << c; string str2 = ss.str(); //注意 使用to_string 方法會(huì)轉(zhuǎn)化為char對應(yīng)的ascii碼 //原因是 to_string 沒有接受char型參數(shù)的函數(shù)原型,有一個(gè)參數(shù)類型 //為int 的函數(shù)原型,所以傳入char型字符 實(shí)際是先將char 轉(zhuǎn)化 //為int 型的ascii 碼,然后再轉(zhuǎn)變?yōu)閟tring //以下輸出結(jié)果為 97 cout << to_string(c) << endl;
關(guān)于C++char和string類型理解
遇到幾個(gè)字符串類型的題目發(fā)現(xiàn)自己對概念模糊不清。
C++中char是字符類型,是一種基本數(shù)據(jù)類型,而string是一個(gè)模板類,實(shí)例化的是對象,它的內(nèi)部是封裝了const char*類型。
在VS2019環(huán)境下,如果char ch="abc";編譯器會(huì)報(bào)錯(cuò),錯(cuò)誤提示為:const char*類型的值不能用于初始化char類型的實(shí)體。
同理,char *ch="abc";也是類似如此。
雙引號應(yīng)該是聲明字符串,編譯器默認(rèn)將雙引號中的內(nèi)容當(dāng)做一個(gè)string類型。
然而char ch=‘abc’;是合法的,是因?yàn)閱我枌⒄麄€(gè)abc視為一個(gè)字符嗎?當(dāng)然不是。
經(jīng)過測試:
char ch='abc'; cout<<ch; //打印c
只打印一個(gè)c,很奇怪。
然而在gcc下會(huì)發(fā)出警告:
我也不是太懂,大佬給我找來了如下圖:
為什么只打印一個(gè)c?
abc是一個(gè)字符串,賦值給一個(gè)字符時(shí),會(huì)取字符串中最低的位數(shù)賦值。
關(guān)于char*和string
前面提到,string內(nèi)部封裝了const char*,是一個(gè)常量指針,指向可以改變,但是指向的值不能改變。
char*是一個(gè)字符型指針,可以指向一個(gè)字符數(shù)組,與string不太相同的是,字符數(shù)組存儲(chǔ)的字符串必須以'\0'結(jié)尾,代表結(jié)束符號,而string并不一定以'\0'結(jié)束。
string的內(nèi)存管理是由系統(tǒng)處理的,除非內(nèi)存池用完,否則基本上不會(huì)出現(xiàn)什么內(nèi)存問題。
而char*的內(nèi)存需要自己手動(dòng)管理了,很容易出現(xiàn)內(nèi)存問題。
所以當(dāng)你需要存一個(gè)串,但是不知道其多大時(shí),用string更為合適。
char*和string的互相轉(zhuǎn)化
如果要將string直接轉(zhuǎn)換為const char*類型,可以使用兩個(gè)函數(shù)。
1.c_str()
string s="abcd"; const char*ch=s.c_str(); //通過VS2019,可以看到該函數(shù)的聲明為:const char*std::string::c_str()const noexcept;
c_str()函數(shù)返回一個(gè)指向正規(guī)C字符串的指針,內(nèi)容與string相同,因?yàn)镃本身沒有string類
但是,上面這種用法很不安全,因?yàn)閏h最后指向的內(nèi)容是垃圾值,s對象被析構(gòu)了。而且c_str()返回的是一個(gè)臨時(shí)指針,不能對其進(jìn)行操作。
通過strcpy函數(shù)來進(jìn)行轉(zhuǎn)換是安全的:
char ch[20]; string s="abcd"; strcpy(ch,s.c_str());
2.data()
string s="abcd"; const char*ch=s.data();
那c_str()和data()有什么區(qū)別呢?
c_str()會(huì)在數(shù)據(jù)的末尾添加'\0'結(jié)束符,多數(shù)用于使用字符串場合。
而data()函數(shù)不會(huì)添加'\0'結(jié)束符。
如果要轉(zhuǎn)換為char*而非const char*類型
string s="abcd"; char *ch; ch=(char*)malloc((s.length())*sizeof(char)); s.copy(ch,s.length(),0);//把當(dāng)前串中以0開始的s.length()個(gè)字符拷貝到以ch為起始位置的字符數(shù)組中,返回實(shí)際拷貝的數(shù)目 cout<<ch;
通過str[i]的方式取值的類型
string s = "abcd"; cout << typeid(s[1]).name() << endl;//char
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++生成隨機(jī)數(shù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了C++生成隨機(jī)數(shù)的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04C++結(jié)構(gòu)體struct和類class區(qū)別詳解
struct和class有什么區(qū)別?最本質(zhì)的一個(gè)區(qū)別就是默認(rèn)的訪問控制:默認(rèn)的繼承訪問權(quán)限,struct是public的,class是private的。2017-11-11C++編程產(chǎn)生指定范圍內(nèi)的隨機(jī)數(shù)
這篇文章主要為大家詳細(xì)介紹了C++編程產(chǎn)生指定范圍內(nèi)的隨機(jī)數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例
這篇文章主要介紹了c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例,需要的朋友可以參考下2014-05-05C++基于Directx MMX實(shí)現(xiàn)的圖像灰度轉(zhuǎn)換代碼
這篇文章主要介紹了C++基于Directx MMX實(shí)現(xiàn)的圖像灰度轉(zhuǎn)換代碼,需要的朋友可以參考下2014-08-08C語言內(nèi)存管理及初始化細(xì)節(jié)示例詳解
這篇文章主要為大家介紹了C語言內(nèi)存管理及初始化細(xì)節(jié)示例的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02