2014-03-07 75 views
0

我正在使用sstream來解析一個字符串。該字符串包含用空格分隔的任意數量的整數。但sstream不能正確解析輸入。這裏是我的代碼 -sstream無法正常工作?

#include<cstdio> 
#include<cstring> 
#include<vector> 
#include<cstdlib> 
#include<sstream> 
#include<iostream> 

using namespace std; 

vector<int> val[10010]; 

int main(){ 

    int n,i,j,temp; 
    stringstream stream; 
    string s; 
    scanf("%d",&n); 
    vector<int>::iterator it; 

    for(i=0; i<n; i++){ 
     getline(cin,s); 
     stream.str(s); 

     while(1) { 
      stream >> temp; 
      val[i].push_back(temp); 
      if(!stream) 
       break; 
     } 

     for(it=val[i].begin(); it!=val[i].end(); it++) 
      printf("%d ",*it); 

     printf("\n"); 
    } 
    return 0; 
} 

下面是測試情況:Code

+3

爲什麼*穿越流*?如果您打算使用C++流解析,您也可以將它們用於輸入和輸出。 –

+1

可能鏈接被破壞? – 4pie0

+0

這裏似乎缺少的另一件事是skipws。 –

回答

0

發生了什麼很明顯。您讀取的第一行是空的 (因爲您在閱讀 計數時已將'\n'保留在流中),那麼您使用stream解析它,以stream結尾爲 失敗狀態。一旦stream處於失敗狀態,則 將保持這種狀態,並且所有其他操作均爲空操作。

更一般地,也有一些與你的代碼的問題:

  • 不要在同一 文件混合物C風格的IO和iostream尤其不能。有時候這是不可避免的,當你不得不處理 傳統庫時,不要故意這樣做。實際上,從來沒有任何理由在C++中使用C風格的IO。

  • 不要在頂部定義所有變量。不要定義 直到你需要它們。特別是, 在循環中聲明字符串流沒有意義(其中 可以避免出現問題)。

  • 檢查std::getline在使用已讀取的 值之前是否成功。

做這樣的事情會使用 向量的載體,用的push_back的慣用方式:

std::vector<std::vector<int>> val; 

// and for the loop... 
std::string line; 
while (std::getline(std::cin, line)) { 
    val.push_back(std::vector<int>()); 
    std::istringstream parse(line); 
    int i; 
    while (parse >> i) { 
     val.back().push_back(i); 
    } 
} 

除非,也許,更多的錯誤檢查。 (難道在whileparse >> i失敗,因爲它讀取了所有行,或者 因爲有人在下滑的​​爲多少?)

1

不知道這是你的主要錯誤,但你有一個\n - scanf("%d",&n);後新生產線,scanf函數只抓住整數,新生產線留下來,getline不會讀取你的輸入。

可以忽略下面這個新的生產線,只調用函數getline前:

if (isspace(cin.peek())) 
    cin.ignore(); 

也,它能夠更好地:

if (stream >> temp) { 
    // do something with temp 
} 

現在你總是與前面分析得到的值作爲最後一個元素添加字符串。

此外,您應該再次使用它之前清除stringstream,否則它保持錯誤狀態,並且您無法使用它。在stream.str(s);之前加上:stream.clear();

+0

是的。有錯誤,謝謝。如果(流>> temp)做出了什麼區別? –

+0

它阻止你插入臨時向量如果流未能解析它。目前它將包含以前的解析值,所以你將有重複的值。 – marcinj

+0

仍然有問題。這裏有一些值,我嘗試http://ideone.com/vfLQhl –

0

在您的scanf之後添加cin.get(); - 這消耗了您在n中閱讀的輸入行末尾處的\ n。之後,你會停止在你的矢量廢話。 cin.ignore(SOME_BIG_NUMBER)也可能工作,不僅跳過下一個字符(可能\ n),而且還跳過它之前的空格。

有你需要一個修復等:最內層循環中,if(!stream) break;前必須val[i].push_back(temp);,否則你會在你的輸入線得到最後INT的額外副本。

我進一步建議您使用流I/O或C風格的I/O(printf,scanf),而不是兩者 - 但這不是你的問題。

+0

這在幾個層面上是不正確的。首先,'cin.get()'不會消耗''\ n';它會消耗下一個字符(可能是尾隨空格)。你絕對需要使用忽略。當然,除了第一個輸入沒有意義。將循環中的數據流讀出,然後使用'while',沒有意義。寫這個有很多更好的方法。 –