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方法來複用流對象

運行結果:

123 456.789 114514 1919.81
#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章