2015-08-30 20 views
1
#include <iostream>   
#include <vector> 
#include <string> 
#include <sstream> 

using namespace std; 
int main(){ 
string a = " test 1234 test 5678"; 
stringstream strstr(a); 
string test; 
vector<int>numvec; 
int num; 
while(strstr>>num || !strstr.eof()){ 
    if(strstr.fail()){ 
     strstr.clear(); 
     string kpz; 
     strstr>>kpz; 

    } 
    numvec.push_back(num); 
} 
for(int i = 0;numvec.size();++i){ 
    cout<<numvec[i]<<'\t'; 
} 
} 

在這個程序中,我試圖解析僅值「1234」和「5678」,從有串詞中有一個字符串流和輸出這些值分析號碼。我把值放在一個Integer向量中,後來我從向量中輸出這些值,然而,輸出是在前幾行中,它向我顯示了值,但是,然後,我得到了很多零,我從未見過這樣的錯誤,它看起來非常有趣,所以我的問題是:爲什麼我沒有得到值「1234」和「5678」作爲想要的輸出? (這是程序僅顯示那些值而不是由錯誤引起的大量零)以及爲什麼會發生此錯誤?未能從字符串流,並將其輸出正確C++

對於程序:http://ideone.com/zn5j08

預先感謝幫助。

+1

在'for'循環的條件永遠是隻要真正爲'numvec'不爲空。你很可能意味着'我

+0

謝謝,沒有注意到。 – zLeon

回答

1

問題是,在檢測到故障狀態後,您的環路沒有continue,這意味着即使在故障後,num的值也會被推入numvec

這裏是你如何解決這個問題:

while(strstr>>num || !strstr.eof()) { 
    if(strstr.fail()){ 
     strstr.clear(); 
     string kpz; 
     strstr>>kpz; 
     continue; // <<== Add this 
    } 
    numvec.push_back(num); 
} 

現在值被壓入numvec只有當strstr不是處於故障狀態,修復你的問題。

Fixed demo.

+0

謝謝,幫忙。但使用'繼續'是安全的嗎? – zLeon

+1

@zLeon是的,這是絕對安全的,因爲循環的每次迭代都會通過流讀取一些進度。這意味着你不會陷入無限循環,這是使用「繼續」的主要危險。 – dasblinkenlight