亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++如何將一個char轉(zhuǎn)化為string

 更新時間:2023年08月01日 09:18:15   作者:carbon06  
這篇文章主要介紹了c++如何將一個char轉(zhuǎn)化為string問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

c++將一個char轉(zhuǎn)化為string

const char c = 'a';
//1.使用 string 的構造函數(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 方法會轉(zhuǎn)化為char對應的ascii碼
//原因是 to_string 沒有接受char型參數(shù)的函數(shù)原型,有一個參數(shù)類型
//為int 的函數(shù)原型,所以傳入char型字符 實際是先將char 轉(zhuǎn)化
//為int 型的ascii 碼,然后再轉(zhuǎn)變?yōu)閟tring
//以下輸出結(jié)果為 97
cout << to_string(c) << endl;

關于C++char和string類型理解

遇到幾個字符串類型的題目發(fā)現(xiàn)自己對概念模糊不清。

C++中char是字符類型,是一種基本數(shù)據(jù)類型,而string是一個模板類,實例化的是對象,它的內(nèi)部是封裝了const char*類型。

在VS2019環(huán)境下,如果char ch="abc";編譯器會報錯,錯誤提示為:const char*類型的值不能用于初始化char類型的實體。

同理,char *ch="abc";也是類似如此。

雙引號應該是聲明字符串,編譯器默認將雙引號中的內(nèi)容當做一個string類型。

然而char ch=‘abc’;是合法的,是因為單引號將整個abc視為一個字符嗎?當然不是。

經(jīng)過測試:

char ch='abc';
cout<<ch;    //打印c

只打印一個c,很奇怪。

然而在gcc下會發(fā)出警告:

我也不是太懂,大佬給我找來了如下圖:

為什么只打印一個c?

abc是一個字符串,賦值給一個字符時,會取字符串中最低的位數(shù)賦值。

關于char*和string

前面提到,string內(nèi)部封裝了const char*,是一個常量指針,指向可以改變,但是指向的值不能改變。

char*是一個字符型指針,可以指向一個字符數(shù)組,與string不太相同的是,字符數(shù)組存儲的字符串必須以'\0'結(jié)尾,代表結(jié)束符號,而string并不一定以'\0'結(jié)束。

string的內(nèi)存管理是由系統(tǒng)處理的,除非內(nèi)存池用完,否則基本上不會出現(xiàn)什么內(nèi)存問題。

而char*的內(nèi)存需要自己手動管理了,很容易出現(xiàn)內(nèi)存問題。

所以當你需要存一個串,但是不知道其多大時,用string更為合適。

char*和string的互相轉(zhuǎn)化

如果要將string直接轉(zhuǎn)換為const char*類型,可以使用兩個函數(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ù)返回一個指向正規(guī)C字符串的指針,內(nèi)容與string相同,因為C本身沒有string類

但是,上面這種用法很不安全,因為ch最后指向的內(nèi)容是垃圾值,s對象被析構了。而且c_str()返回的是一個臨時指針,不能對其進行操作。

通過strcpy函數(shù)來進行轉(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()會在數(shù)據(jù)的末尾添加'\0'結(jié)束符,多數(shù)用于使用字符串場合。

而data()函數(shù)不會添加'\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);//把當前串中以0開始的s.length()個字符拷貝到以ch為起始位置的字符數(shù)組中,返回實際拷貝的數(shù)目
cout<<ch;

通過str[i]的方式取值的類型

string s = "abcd";
	cout << typeid(s[1]).name() << endl;//char

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C語言數(shù)據(jù)結(jié)構單鏈表接口函數(shù)全面講解教程

    C語言數(shù)據(jù)結(jié)構單鏈表接口函數(shù)全面講解教程

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構單鏈表所有接口函數(shù)的全面講解教程,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-10-10
  • C/C++中提高查找速度的小技巧

    C/C++中提高查找速度的小技巧

    這篇文章主要給大家介紹了C/C++中提高數(shù)組中查找某個元素或者字符串中查找某個字符效率的小技巧,提高速度對我們?nèi)粘i_發(fā)來說還是很有用的,文中給出了詳細的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 如何獲取C++類成員虛函數(shù)地址的示例代碼

    如何獲取C++類成員虛函數(shù)地址的示例代碼

    這篇文章主要給大家介紹了關于C++如何獲取類成員虛函數(shù)地址的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。
    2017-08-08
  • 淺談c++中的異常處理機制

    淺談c++中的異常處理機制

    C++異常處理機制通過try/catch/throw結(jié)構處理運行時錯誤,本文就來介紹一下c++中的異常處理機制,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • 利用Debug調(diào)試代碼解決0xC0000005:?讀取位置?0x0000000000000000?時發(fā)生訪問沖突問題

    利用Debug調(diào)試代碼解決0xC0000005:?讀取位置?0x0000000000000000?時發(fā)生訪問沖突問

    這篇文章主要介紹了利用Debug調(diào)試代碼解決0xC0000005:?讀取位置?0x0000000000000000?時發(fā)生訪問沖突,本文給大家分享完美解決方案,需要的朋友可以參考下
    2023-03-03
  • 嵌入式C語言輕量級程序架構內(nèi)核編寫

    嵌入式C語言輕量級程序架構內(nèi)核編寫

    這篇文章主要介紹了嵌入式C語言輕量級程序架構內(nèi)核編寫,文章將讓大家學到輕量級程序架構的內(nèi)核實現(xiàn)原理、輕量級程序架構的設計思想、了解單片機常用的程序架構等更多C語言輕量級程序架構相關內(nèi)容,需要的朋友可以參考一下
    2022-03-03
  • C語言中的隱式函數(shù)聲明

    C語言中的隱式函數(shù)聲明

    在c語言里面開來還是要學習c++的編程習慣,使用函數(shù)之前一定要聲明。不然,即使編譯能通過,運行時也可能會出一些莫名其妙的問題。
    2016-01-01
  • C語言實現(xiàn)二叉鏈表存儲

    C語言實現(xiàn)二叉鏈表存儲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)二叉鏈表存儲的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • C++設計模式之觀察者模式

    C++設計模式之觀察者模式

    這篇文章主要介紹了C++設計模式之觀察者模式,本文講解了什么是觀察者模式、觀察者模式的UML類圖、觀察者模式的使用場合等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C++中的多態(tài)與多重繼承實現(xiàn)與Java的區(qū)別

    C++中的多態(tài)與多重繼承實現(xiàn)與Java的區(qū)別

    這篇文章主要介紹了C++中的多態(tài)與多重繼承實現(xiàn)與Java的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論