2012-09-30 94 views
0

ALL, 這裏是我的代碼:轉換的std :: string整數

std::string version = curl_version(); 
version = version.substr(version.find('/') + 1); 
int min, max; 
int pos = version.find('.'); 
std::stringstream stream(version.substr(0, pos)); 
version = version.substr(pos + 1); 
stream >> max; 
pos = version.find('.'); 
stream.str(version.substr(0, pos)); 
stream >> min; 

我只是重複使用相同的流對象,但由於某種原因分鐘變量沒有正確分配。

我錯過了什麼?

謝謝。

+0

您是否驗證過您挑出的子字符串其實是正確的,即實際的數字? –

+0

@MattPhillips,是的。 curl_version()給出「libcurl/7.26.0」。首先,我切斷了「libcurl /」。然後,「max」得到「7」,但是min不會得到26. – Igor

+0

好吧,爲了清楚起見,'version.substr(0,pos)'的最後一個實例的計算結果爲「26」? –

回答

0

的問題是,你不能重複使用相同的stringstream對象,嘗試做這樣的代替:

std::string version = curl_version(); 
version = version.substr(version.find('/') + 1); 
int min, max; 
int pos = version.find('.'); 
std::stringstream stream(version.substr(0, pos)); 
version = version.substr(pos + 1); 
stream >> max; 
pos = version.find('.'); 
std::stringstream stream1(version.substr(0, pos)); 
stream1 >> min; 

看來,當你轉移(>>)了字符串流的,它到達eof(可以通過調用stream.eof()來檢查)設置了一個標誌,即使您設置了(通過調用str())一個新的關聯字符串對象,也可以防止進一步移出。 要使其工作,必須在再次移出之前調用clear()。

std::string version = curl_version(); 
version = version.substr(version.find('/') + 1); 
int min, max; 
int pos = version.find('.'); 
std::stringstream stream(version.substr(0, pos)); 
version = version.substr(pos + 1); 
stream >> max; 
pos = version.find('.'); 
stream.str(version.substr(0, pos)); 
str.clear(); 
stream >> min; 
+0

有趣。這有什麼原因嗎?它是否記錄在某處?只需設置不同的值,我就可以很好地重用我創建的任何內容。爲什麼不爲這個班?它具有公共set()方法... – Igor

+0

其實這個:http://www.cplusplus.com/reference/iostream/stringstream/給出:「這個類的對象內部維護一個指向stringbuf對象的指針,可以是通過調用成員rdbuf獲取/修改「。所以也許我只是做錯了? – Igor

+2

文檔說它等同於一個集合,但即使沒有錯誤(fail()爲false),也可以保留一些東西,或者可以在str()之前使用clear()並使用同一個對象。 – imreal

0

的原因是,這只是調用std::stringstream::str不改變內部的字符串,但它不重置任何錯誤標誌。所以當前面的字符串到達​​字符串末尾或另一個「錯誤」時,流仍然認爲它出現這個錯誤。在更改字符串後,請撥打std::striungstream::clear以清除錯誤標誌。