一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

string和stringstream用法總結(jié)

 印度阿三17 2019-08-22
原文鏈接:https://blog.csdn.net/xw20084898/article/details/21939811

一、string

string?是 C 提供的字串型態(tài),和 C 的字串相比,除了有不限長(zhǎng)度的優(yōu)點(diǎn)外,還有其他許多方便的功能。要使用?string, 必須先加入這一行:

#include <string>
接下來(lái)要宣告一個(gè)字串變量,可以寫(xiě)成:

string s;
我們也可以在宣告的同時(shí)讓它設(shè)成某個(gè)字串:

string s="TCGS";
而要取得其中某一個(gè)字元,和傳統(tǒng)C 的字串一樣是用?s[i]?的方式取得。比較不一樣的是如果 s 有三個(gè)字元,傳統(tǒng) C 的字串的 s[3] 是 0 字元,但是 C 的?string?則是只到 s[2] 這個(gè)字元而已。

下面我們把 string 與 字元陣列的語(yǔ)法做一個(gè)對(duì)照:

操作?? ?string?? ?字元陣列
宣告字串?? ?string s;?? ?char s[100];
取得第 i 個(gè)字元?? ?s[i]?? ?s[i]
字串長(zhǎng)度?? ?s.length()
或 s.size()?? ?strlen(s)
讀取一行?? ?getline(cin, s);?? ?gets(s);
設(shè)成某字串?? ?s="TCGS";?? ?strcpy(s, "TCGS");
字串相加?? ?s=s "TCGS";
s ="TCGS"?? ?strcat(s, "TCGS");
字串比較?? ?s=="TCGS"?? ?strcmp(s, "TCGS")
從上面的表格,我們可以發(fā)現(xiàn)?string?的用法比較直觀,因此如果沒(méi)有特別的需要,盡量使用?string?會(huì)比較方便。

?

二、stringstream

stringstream?是 C 提供的另一個(gè)字串型的串流(stream)物件,和之前學(xué)過(guò)的?iostream、fstream?有類(lèi)似的操作方式。要使用?stringstream, 必須先加入這一行:

#include <sstream>
stringstream?主要是用在將一個(gè)字串分割,可以先用?clear( )以及?str( )?將指定字串設(shè)定成一開(kāi)始的內(nèi)容,再用?>>?把個(gè)別的資料輸出,例如:

string s;
stringstream ss;
int a, b, c;
getline(cin, s);
ss.clear();
ss.str(s);
ss >> a >> b >> c;
下面我們看到一個(gè)使用?stringstream?的例子:

題目:輸入的第一行有一個(gè)數(shù)字 N 代表接下來(lái)有 N 行資料,每一行資料里有不固定個(gè)數(shù)的整數(shù)(最多 20 個(gè),每行最大 200 個(gè)字元),請(qǐng)你寫(xiě)一個(gè)程式將每行的總和印出來(lái)。

輸入:

3
1 2 3
20 17 23 54 77 60
111 222 333 444 555 666 777 888 999

輸出:

6
251
4995

程式如下:

string s;
stringstream ss;
int n, i, sum, a;
cin >> n;
getline(cin, s); // 讀取換行
for (i=0; i<n; i )
{
? ? getline(cin, s);
? ? ss.clear();
? ? ss.str(s);
? ? sum=0;
? ? while (1)
? ? {
? ? ? ? ss >> a;
? ? ? ? if ( ss.fail() ) break;
? ? ? ? sum =a;
? ? }
? ? cout << sum << endl;
}
?string類(lèi)型是c語(yǔ)言中char *類(lèi)型的一種更便利的實(shí)現(xiàn)。使用這個(gè)類(lèi)型,不用再去刻意考慮內(nèi)存的事兒。在做快速開(kāi)發(fā)的時(shí)候,string對(duì)象提供的便利,還是相當(dāng)出色的。然而,在這兒提醒一下:string類(lèi)型很有可能成為一個(gè)工程效率問(wèn)題的根源,產(chǎn)品級(jí)別的應(yīng)用當(dāng)中,應(yīng)該盡量避免在深層循環(huán)嵌套中使用string類(lèi)型。
????除size()外,另外兩個(gè)string常用的方法是find和substr。在下面的代碼當(dāng)中:
????string str = "aaaaddddssdfsasdf";
????size_t pos = str.find("ssdf", 3);???????????????????????//用if(pos == string::npos) 用來(lái)判斷是否找到子串。
????string str2 = str.substr(pos, 5);
????find函數(shù)從str的第3個(gè)位置查起,找到ssdf這個(gè)子串后,返回子串的位置。而substr函數(shù)從pos位置開(kāi)始,截取5個(gè)字符,賦值給str2。也就是說(shuō),str2之后的內(nèi)容將是ssdfs。

????stringstream是字符串流,經(jīng)常被我用來(lái)作數(shù)據(jù)切分或者類(lèi)型轉(zhuǎn)化。一個(gè)經(jīng)常被我用到的函數(shù)如下:
string i2s(int i, int len = 0)
{
????stringstream ss;
????ss << setw(len) << setfill('0') << i;
????return ss.str():
}
????以i2s(7, 3)形式調(diào)用這個(gè)函數(shù),返回的結(jié)果是字符串007。我通常在循環(huán)里,這樣產(chǎn)生或者遍歷一些文件。


使用stringstream對(duì)象簡(jiǎn)化類(lèi)型轉(zhuǎn)換
C 標(biāo)準(zhǔn)庫(kù)中的<sstream>提供了比ANSI C的<stdio.h>更高級(jí)的一些功能,即單純性、類(lèi)型安全和可擴(kuò)展性。在本文中,我將展示怎樣使用這些庫(kù)來(lái)實(shí)現(xiàn)安全和自動(dòng)的類(lèi)型轉(zhuǎn)換。

為什么要學(xué)習(xí)

如果你已習(xí)慣了<stdio.h>風(fēng)格的轉(zhuǎn)換,也許你首先會(huì)問(wèn):為什么要花額外的精力來(lái)學(xué)習(xí)基于<sstream>的類(lèi)型轉(zhuǎn)換呢?也許對(duì)下面一個(gè)簡(jiǎn)單的例子的回顧能夠說(shuō)服你。假設(shè)你想用sprintf()函數(shù)將一個(gè)變量從int類(lèi)型轉(zhuǎn)換到字符串類(lèi)型。為了正確地完成這個(gè)任務(wù),你必須確保證目標(biāo)緩沖區(qū)有足夠大空間以容納轉(zhuǎn)換完的字符串。此外,還必須使用正確的格式化符。如果使用了不正確的格式化符,會(huì)導(dǎo)致非預(yù)知的后果。下面是一個(gè)例子:

int n=10000;

chars[10];

sprintf(s,”%d”,n);// s中的內(nèi)容為“10000”

到目前為止看起來(lái)還不錯(cuò)。但是,對(duì)上面代碼的一個(gè)微小的改變就會(huì)使程序崩潰:

int n=10000;

char s[10];

sprintf(s,”%f”,n);// 看!錯(cuò)誤的格式化符


在這種情況下,程序員錯(cuò)誤地使用了%f格式化符來(lái)替代了%d。因此,s在調(diào)用完sprintf()后包含了一個(gè)不確定的字符串。要是能自動(dòng)推導(dǎo)出正確的類(lèi)型,那不是更好嗎?

進(jìn)入stringstream

由于n和s的類(lèi)型在編譯期就確定了,所以編譯器擁有足夠的信息來(lái)判斷需要哪些轉(zhuǎn)換。<sstream>庫(kù)中聲明的標(biāo)準(zhǔn)類(lèi)就利用了這一點(diǎn),自動(dòng)選擇所必需的轉(zhuǎn)換。而且,轉(zhuǎn)換結(jié)果保存在stringstream對(duì)象的內(nèi)部緩沖中。你不必?fù)?dān)心緩沖區(qū)溢出,因?yàn)檫@些對(duì)象會(huì)根據(jù)需要自動(dòng)分配存儲(chǔ)空間。

你的編譯器支持<sstream>嗎?

<sstream>庫(kù)是最近才被列入C 標(biāo)準(zhǔn)的。(不要把<sstream>與標(biāo)準(zhǔn)發(fā)布前被刪掉的<strstream>弄混了。)因此,老一點(diǎn)的編譯器,如GCC2.95,并不支持它。如果你恰好正在使用這樣的編譯器而又想使用<sstream>的話,就要先對(duì)它進(jìn)行升級(jí)更新。

<sstream>庫(kù)定義了三種類(lèi):istringstream、ostringstream和stringstream,分別用來(lái)進(jìn)行流的輸入、輸出和輸入輸出操作。另外,每個(gè)類(lèi)都有一個(gè)對(duì)應(yīng)的寬字符集版本。簡(jiǎn)單起見(jiàn),我主要以stringstream為中心,因?yàn)槊總€(gè)轉(zhuǎn)換都要涉及到輸入和輸出操作。

注意,<sstream>使用string對(duì)象來(lái)代替字符數(shù)組。這樣可以避免緩沖區(qū)溢出的危險(xiǎn)。而且,傳入?yún)?shù)和目標(biāo)對(duì)象的類(lèi)型被自動(dòng)推導(dǎo)出來(lái),即使使用了不正確的格式化符也沒(méi)有危險(xiǎn)。

string到int的轉(zhuǎn)換

string result=”10000”;
int n=0;
stream<<result;
stream>>n;//n等于10000


重復(fù)利用stringstream對(duì)象

如果你打算在多次轉(zhuǎn)換中使用同一個(gè)stringstream對(duì)象,記住再每次轉(zhuǎn)換前要使用clear()方法;

在多次轉(zhuǎn)換中重復(fù)使用同一個(gè)stringstream(而不是每次都創(chuàng)建一個(gè)新的對(duì)象)對(duì)象最大的好處在于效率。stringstream對(duì)象的構(gòu)造和析構(gòu)函數(shù)通常是非常耗費(fèi)CPU時(shí)間的。

在類(lèi)型轉(zhuǎn)換中使用模板

你可以輕松地定義函數(shù)模板來(lái)將一個(gè)任意的類(lèi)型轉(zhuǎn)換到特定的目標(biāo)類(lèi)型。例如,需要將各種數(shù)字值,如int、long、double等等轉(zhuǎn)換成字符串,要使用以一個(gè)string類(lèi)型和一個(gè)任意值t為參數(shù)的to_string()函數(shù)。to_string()函數(shù)將t轉(zhuǎn)換為字符串并寫(xiě)入result中。使用str()成員函數(shù)來(lái)獲取流內(nèi)部緩沖的一份拷貝:

template<class T>

void to_string(string & result,const T& t)

{

?ostringstream oss;//創(chuàng)建一個(gè)流

oss<<t;//把值傳遞如流中

result=oss.str();//獲取轉(zhuǎn)換后的字符轉(zhuǎn)并將其寫(xiě)入result
}

這樣,你就可以輕松地將多種數(shù)值轉(zhuǎn)換成字符串了:

to_string(s1,10.5);//double到string

to_string(s2,123);//int到string

to_string(s3,true);//bool到string

可以更進(jìn)一步定義一個(gè)通用的轉(zhuǎn)換模板,用于任意類(lèi)型之間的轉(zhuǎn)換。函數(shù)模板convert()含有兩個(gè)模板參數(shù)out_type和in_value,功能是將in_value值轉(zhuǎn)換成out_type類(lèi)型:

template<class out_type,class in_value>

out_type convert(const in_value & t)

{

stringstream stream;

stream<<t;//向流中傳值

out_type result;//這里存儲(chǔ)轉(zhuǎn)換結(jié)果

stream>>result;//向result中寫(xiě)入值

return result;

}

這樣使用convert():

double d;

string salary;

string s=”12.56”;

d=convert<double>(s);//d等于12.56

salary=convert<string>(9000.0);//salary等于”9000”

結(jié)論

?

在過(guò)去留下來(lái)的程序代碼和純粹的C程序中,傳統(tǒng)的<stdio.h>形式的轉(zhuǎn)換伴隨了我們很長(zhǎng)的一段時(shí)間。但是,如文中所述,基于stringstream的轉(zhuǎn)換擁有類(lèi)型安全和不會(huì)溢出這樣搶眼的特性,使我們有充足得理由拋棄<stdio.h>而使用<sstream>。<sstream>庫(kù)還提供了另外一個(gè)特性—可擴(kuò)展性。你可以通過(guò)重載來(lái)支持自定義類(lèi)型間的轉(zhuǎn)換。

一些實(shí)例:


stringstream通常是用來(lái)做數(shù)據(jù)轉(zhuǎn)換的。

相比c庫(kù)的轉(zhuǎn)換,它更加安全,自動(dòng)和直接。

?

例子一:基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換例子 int轉(zhuǎn)string

?

#include?<string>
#include?<sstream>
#include?<iostream>?

int?main()
{
????std::stringstream?stream;
????std::string?result;
????int?i?=?1000;
????stream?<<?i;?//將int輸入流
????stream?>>?result;?//從stream中抽取前面插入的int值
????std::cout?<<?result?<<?std::endl;?//?print?the?string?"1000"
}?
?

?

運(yùn)行結(jié)果:

?

例子二:除了基本類(lèi)型的轉(zhuǎn)換,也支持char *的轉(zhuǎn)換。

?

#include?<sstream>
#include?<iostream>?

int?main()
{
????std::stringstream?stream;
????char?result[8]?;
????stream?<<?8888;?//向stream中插入8888
????stream?>>?result;?//抽取stream中的值到result
????std::cout?<<?result?<<?std::endl;?//?屏幕顯示?"8888"
}?
?

?

?

例子三:再進(jìn)行多次轉(zhuǎn)換的時(shí)候,必須調(diào)用stringstream的成員函數(shù)clear().

?

#include?<sstream>
#include?<iostream>
int?main()
{
????std::stringstream?stream;
????int?first,?second;
????stream<<?"456";?//插入字符串
????stream?>>?first;?//轉(zhuǎn)換成int
????std::cout?<<?first?<<?std::endl;
????stream.clear();?//在進(jìn)行多次轉(zhuǎn)換前,必須清除stream
????stream?<<?true;?//插入bool值
????stream?>>?second;?//提取出int
????std::cout?<<?second?<<?std::endl;
}?
?

運(yùn)行clear的結(jié)果

沒(méi)有運(yùn)行clear的結(jié)果


?————————————————?
版權(quán)聲明:本文為CSDN博主「仗劍走海角」的原創(chuàng)文章,遵循CC 4.0 by-sa版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xw20084898/article/details/21939811

來(lái)源:https://www./content-4-400501.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    欧美日韩国产精品自在自线| 亚洲欧美日韩网友自拍| 国产精品偷拍视频一区| 国产精品亚洲综合天堂夜夜| 日本中文在线不卡视频| 欧美日本亚欧在线观看| 国产日韩欧美专区一区| 好吊妞视频只有这里有精品| 久久精品国产一区久久久| 欧美日韩一区二区午夜| 91人妻人人揉人人澡人| 麻豆国产精品一区二区| 国产精品久久三级精品| 男女午夜福利院在线观看 | 一区二区日韩欧美精品| 欧美在线观看视频免费不卡| 国产成人亚洲综合色就色| 在线观看日韩欧美综合黄片| 国产一级二级三级观看| 久一视频这里只有精品| 中日韩免费一区二区三区| 国产精品第一香蕉视频| 亚洲视频一区自拍偷拍另类| 日韩精品你懂的在线观看| 邻居人妻人公侵犯人妻视频| 国产日韩精品激情在线观看| 老司机精品福利视频在线播放 | 中文字幕人妻日本一区二区 | 国产精品久久久久久久久久久痴汉 | 精品精品国产自在久久高清| 国产又粗又猛又爽又黄| 开心五月激情综合婷婷色| 丰满少妇被粗大猛烈进出视频| 东京热男人的天堂一二三区| 免费在线观看欧美喷水黄片| 翘臀少妇成人一区二区| 日韩一区二区三区免费av| 日本一级特黄大片国产| 欧美成人免费一级特黄| 在线观看视频日韩精品 | 中文字幕一区二区三区大片|