最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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對(duì)應(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)自己對(duì)概念模糊不清。

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

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

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

雙引號(hào)應(yīng)該是聲明字符串,編譯器默認(rèn)將雙引號(hào)中的內(nèi)容當(dāng)做一個(gè)string類型。

然而char ch=‘abc’;是合法的,是因?yàn)閱我?hào)將整個(gè)abc視為一個(gè)字符嗎?當(dāng)然不是。

經(jīng)過測(cè)試:

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é)束符號(hào),而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對(duì)象被析構(gòu)了。而且c_str()返回的是一個(gè)臨時(shí)指針,不能對(duì)其進(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ù)用于使用字符串場(chǎng)合。

而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++實(shí)現(xiàn)LeetCode(138.拷貝帶有隨機(jī)指針的鏈表)

    C++實(shí)現(xiàn)LeetCode(138.拷貝帶有隨機(jī)指針的鏈表)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(138.拷貝帶有隨機(jī)指針的鏈表),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt使用Matlab函數(shù)的詳細(xì)步驟

    Qt使用Matlab函數(shù)的詳細(xì)步驟

    由于項(xiàng)目需要,需要調(diào)用現(xiàn)有的matlab程序,下面這篇文章主要給大家介紹了關(guān)于Qt使用Matlab函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 深入淺析C++中的#,##,和

    深入淺析C++中的#,##,和

    這篇文章主要介紹了C++中的#,##,和"的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • C++靜態(tài)庫與動(dòng)態(tài)庫文件的生成和使用教程

    C++靜態(tài)庫與動(dòng)態(tài)庫文件的生成和使用教程

    庫文件是計(jì)算機(jī)上的一類文件,可以簡單的把庫文件看成一種代碼倉庫,它提供給使用者一些可以直接拿來用的變量、函數(shù)和類,下面這篇文章主要給大家介紹了關(guān)于C++靜態(tài)庫與動(dòng)態(tài)庫文件的生成和使用的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 判斷機(jī)器大小端的兩種實(shí)現(xiàn)方法

    判斷機(jī)器大小端的兩種實(shí)現(xiàn)方法

    第一種方法,思路:利用指針的強(qiáng)制類型轉(zhuǎn)換。第二種方法,思路:利用共用體所有數(shù)據(jù)都從同一地址開始存儲(chǔ)。
    2013-03-03
  • 使用opencv拉伸圖像擴(kuò)大分辨率示例

    使用opencv拉伸圖像擴(kuò)大分辨率示例

    這篇文章主要介紹了使用opencv拉伸圖像擴(kuò)大分辨率示例,需要的朋友可以參考下
    2014-04-04
  • C語言基于graphics.h實(shí)現(xiàn)圣誕樹

    C語言基于graphics.h實(shí)現(xiàn)圣誕樹

    這篇文章主要介紹了圣誕樹代碼,c語言編程,基于graphics.h實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C++數(shù)據(jù)結(jié)構(gòu)哈希表詳解

    C++數(shù)據(jù)結(jié)構(gòu)哈希表詳解

    C++標(biāo)準(zhǔn)庫中使用的unordered_map底層實(shí)現(xiàn)是哈希表,下面這篇文章主要給大家介紹了關(guān)于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以參考下
    2022-07-07
  • C++中輸入輸出流及文件流操作總結(jié)

    C++中輸入輸出流及文件流操作總結(jié)

    這篇文章主要為大家總結(jié)了C++中輸入輸出流及文件流操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C++共享內(nèi)存刪除的陷阱

    C++共享內(nèi)存刪除的陷阱

    這篇文章主要介紹了C++共享內(nèi)存刪除的陷阱講解,當(dāng)進(jìn)程結(jié)束使用共享內(nèi)存區(qū)時(shí),要通過函數(shù) shmdt 斷開與共享內(nèi)存區(qū)的連接。下面來看看具體問題都是怎么解決的吧
    2022-01-01

最新評(píng)論

怀化市| 华容县| 海晏县| 泸溪县| 卢龙县| 香港 | 桐乡市| 五华县| 山阴县| 南通市| 土默特右旗| 丰台区| 米易县| 上栗县| 泽库县| 梁河县| 通辽市| 崇信县| 昌吉市| 宝清县| 河东区| 迭部县| 塔城市| 东港市| 濮阳县| 兴山县| 昌吉市| 灵石县| 安丘市| 仁寿县| 绵阳市| 华坪县| 田阳县| 涞源县| 利川市| 博爱县| 吉安县| 静安区| 博客| 喀什市| 望都县|