天天看點

c++ stringstream簡單實作string與int/double轉換

一些進階語言比如py,他們的資料類型之間的轉換,都擁有靈活而便利的特性,然而c++也提供了一些友善的輔助庫,今天來學習stringstream,字元串流在變量類型轉換中的應用,這使得程式設計的速度,大大的提高了

流的概念

說到流,最常用的就是iostream 即 input / output stream 輸入輸出流,回想我們是怎樣使用流的?

cout<<a;	// 向輸出流中添加資料a
cin>>b;		// 讀取輸入流的資料到b
           

箭頭的朝向(即移位運算符的方向)決定了資料的流向,而

cout<<a;

顯然是向輸出流中添加資料a,

cin>>b;

是讀取輸入流的資料到b

可以把流了解成一個“隊列”,最後我們添加的東西會按順序相應的被輸出,或者是變量按順序被讀取,這和我們的認知是相同的

流的弱類型

在一句 cout 裡面,我們可以輸入任意資料類型,最後他們都會恰當的被轉化到螢幕上面,這是一個好特性

那麼有沒有一種流,可以輸入字元串,輸出整數,或者是輸入整數,輸出字元串呢,這樣就可以摒棄itoa或者atoi了,答案是

stringstream

stringstream的使用

利用stringstream對象,可以靈活的讀入任意類型資料(數字類型和string),輸出任意類型資料,實作資料類型的轉化

栗子:int轉string

可以簡單地向字元流中加入資料,然後以另一類型從字元流中讀取資料,以完成轉化,string轉int同樣可以用類似的操作實作

using namespace std;
stringstream ss;
	
int x = 114514;
string str;

ss<<x;		// 向字元流中加入 x 
ss>>str;	// 從字元流中以string類型的形式取資料 
 
cout<<str<<endl;

// 代碼的執行結果是 114514
           

流的複用

上文提到,因為流類似隊列,一個流一旦被打開,他會儲存之前加入過的資料,稍有不慎就會因為舊的資料的影響,而導緻轉化的失敗,最好的習慣是每次複用流對象之前,調用clear方法,清空流,再加入新資料,或者是申請新的stringstream對象也是可以的

下面這個例子展示了錯誤的轉換

using namespace std;
stringstream ss;
	
int res;

ss<<114;		
ss<<514;	
ss>>res;

cout<<res<<endl;

// 運作結果:114514
           

用clear方法來複用流對象

運作結果:

#include <bits/stdc++.h>

using namespace std;

int main()
{ 	
	stringstream ss;

	int n1;
	double n2;
	string n3, n4;
	
	// string 轉 int / double 
	ss.clear();
	ss<<"123";
	ss>>n1;
	
	ss.clear();
	ss<<"456.789";
	ss>>n2;
	
	// int / double 轉string
	ss.clear(); 
	ss<<114514;
	ss>>n3;
	
	ss.clear();
	ss<<1919.81;
	ss>>n4;
	
	cout<<n1<<" "<<n2<<" "<<n3<<" "<<n4<<endl;
	
	return 0;
}
           

繼續閱讀