使用stringstream進行類型轉換與字符串分割

C++標準庫中的<sstream>提供了比ANSI C的<stdio.h>更高級的一些功能,即單純性、類型安全和可擴展性。html

若是你已習慣了<stdio.h>風格的轉換,也許你首先會問:爲何要花額外的精力來學習基於<sstream>的類型轉換呢?也許對下面一個簡單的例子的回顧可以說服你。假設你想用sprintf()函數將一個變量從int類型轉換到字符串類型。爲了正確地完成這個任務,你必須確保證目標緩衝區有足夠大空間以容納轉換完的字符串。此外,還必須使用正確的格式化符。若是使用了不正確的格式化符,會致使非預知的後果。下面是一個例子:程序員

int n=10000;

chars[10];

sprintf(s,」%d」,n);     // s中的內容爲「10000」
到目前爲止看起來還不錯。可是,對上面代碼的一個微小的改變就會使程序崩潰:
int n=10000;

char s[10];

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

在這種狀況下,程序員錯誤地使用了%f格式化符來替代了%d。所以,s在調用完sprintf()後包含了一個不肯定的字符串。要是能自動推導出正確的類型,那不是更好嗎?數組

進入stringstream
因爲ns的類型在編譯期就肯定了,因此編譯器擁有足夠的信息來判斷須要哪些轉換。<sstream>庫中聲明的標準類就利用了這一點,自動選擇所必需的轉換。並且,轉換結果保存在stringstream對象的內部緩衝中。你沒必要擔憂緩衝區溢出,由於這些對象會根據須要自動分配存儲空間。
安全

<sstream>庫定義了三種類:istringstream、ostringstream和stringstream,分別用來進行流的輸入、輸出和輸入輸出操做。另外,每一個類都有一個對應的寬字符集版本。簡單起見,我主要以stringstream爲中心,由於每一個轉換都要涉及到輸入和輸出操做。

注意,<sstream>使用string對象來代替字符數組。這樣能夠避免緩衝區溢出的危險。並且,傳入參數和目標對象的類型被自動推導出來,即便使用了不正確的格式化符也沒有危險。

string到int的轉換
函數

string result=」10000」;

int n=0;

stream<<result;

stream>>n;     //n等於10000

重複利用stringstream對象學習

若是你打算在屢次轉換中使用同一個stringstream對象,記住再每次轉換前要使用clear()方法;spa

在屢次轉換中重複使用同一個stringstream(而不是每次都建立一個新的對象)對象最大的好處在於效率。stringstream對象的構造和析構函數一般是很是耗費CPU時間的。code

.clear()是清空標誌位 
.str() 是清內容htm

istringstream對象

  istringstream是由一個string對象構造而來,istringstream類從一個string對象讀取字符。 
  (a)   istringstream istr; 
        istr.str("1 56.7",); 
    (b) 上述兩個過程能夠簡單寫成 istringstream istr("1 56.7");

ostringstream 是向一個string對象輸出字符

    ostringstream ostr;

 a. 得到字符串 .str();

 b. 每次不一樣的使用時刻必需要清空 ss.str(""), iss.str(""), oss.str(""),暫時沒有發現其它的清空方法

 


 

字符串的分割/Split函數的簡單實現

stringstream的另外一個用途是進行字符串的分割。在std::string中沒有實現split函數(Java中的string實現了split函數,使得使用很是方便)。爲此能夠使用stringstream進行字符串的分割,以下所示:

    std::string str_temp = "hello   world   !";
    std::stringstream stream1(str_temp);
    while(stream1 >> str_temp){
        printf("%s\n",str_temp.c_str());
    }

 便可將字符串進行分割。上述的stringstream能夠用istringstream代替。

部份內容節選自 http://www.cnblogs.com/yaozhongxiao/archive/2009/05/23/1487903.html

(完)

相關文章
相關標籤/搜索