2011-08-30 53 views
1

C++拆分我被賦予的形式輸入的輸入問題

(8,7,15) 
(0,0,1) (0,3,2) (0,6,3) 
(1,0,4) (1,1,5) 
(2,1,6) (2,2,7) (2,5,8) 
(3,0,9) (3,3,10) (3,4,11) (3,5,12) 
(4,1,13) (4,4,14) 
(7,6,15) 

在那裏我記得有三元的量。我寫了一個快速測試程序,嘗試讀取cin的輸入,然後將字符串拆分爲輸入的數字。該計劃似乎並沒有讀取所有的行,(1,1,5)後停止,並打印出隨機7事後

我創造了這個快速測試功能爲我試圖創建我的任務的功能之一:

int main() 
{ 
    string line; 
    char * parse; 

    while (getline(cin, line)) { 

    char * writable = new char[line.size() + 1]; 
    copy (line.begin(), line.end(), writable); 
    parse = strtok (writable," (,)"); 

    while (parse != NULL) 
    { 
     cout << parse << endl; 
     parse = strtok (NULL," (,)"); 
     cout << parse << endl; 
     parse = strtok (NULL," (,)"); 
     cout << parse << endl; 
     parse = strtok (NULL," (,)"); 
    } 

    } 
    return 0; 
} 

有人可以幫我修理我的代碼或給我一個工作示例嗎?

+0

您是否嘗試過它運行在調試器下找到它出現segfaults確切行? – unkulunkulu

+0

不能重現:http://ideone.com/k9ZAb – kay

+0

@kay它不再seg錯誤,但這裏仍然有一個問題,使我的輸出不正確 – SNpn

回答

3

你可以使用這個簡單的功能:

istream& read3(int& a, int& b, int& c, istream& stream = cin) { 
    stream.ignore(INT_MAX, '('); 
    stream >> a; 
    stream.ignore(INT_MAX, ','); 
    stream >> b; 
    stream.ignore(INT_MAX, ','); 
    stream >> c; 
    stream.ignore(INT_MAX, ')'); 

    return stream; 
} 

它預計流從(開始,因此它會跳過任何字符,並在它看到的第一個(後停止。它將int讀入a(通過引用傳遞(因此外部a受此影響),然後讀取並跳過它所看到的第一個逗號。清洗,沖洗,重複。然後在閱讀第三個int之後,它跳過了關閉),因此它已準備好再次執行此操作。

它還返回一個istream&具有operator bool重載返回false時,流在其結束,這是打破在本例中的while循環。

你使用這樣的:

// don't forget the appropriate headers... 
#include <iostream> 
#include <sstream> 
#include <string> 

int a, b, c; 

while (read3(a, b, c)) { 
    cout << a << ' ' << b << ' ' << c << endl; 
} 

,打印:

8 7 15 
0 0 1 
0 3 2 
0 6 3 
1 0 4 
1 1 5 
2 1 6 
2 2 7 
2 5 8 
3 0 9 
3 3 10 
3 4 11 
3 5 12 
4 1 13 
4 4 14 
7 6 15 

當你給它輸入。

因爲這是一個任務,我讓你添加錯誤處理等

+0

什麼是讀取每行多少個三元組的好方法? – SNpn

+0

@snpn你可以做很多事情。一種方法是使用std :: getline來讀取一行並計數#((然後將該行包裝在一個字符串流中並對其執行read3)。 –