2011-03-31 55 views
7

我試圖做一個簡單的任務,從控制檯讀取空格分隔的數字到vector<int>,但我沒有得到如何正確執行此操作。如何從控制檯讀取空格分隔的數字?

這是我做了什麼至今:

int n = 0; 
vector<int> steps; 
while(cin>>n) 
{ 
    steps.push_back(n); 
} 

然而,這需要用戶按無效字符(如a)打破while循環。我不想要它。

只要用戶輸入像0 2 3 4 5這樣的數字,然後按Enter我希望循環被打破。我也嘗試使用istream_iteratorcin.getline,但我無法正常工作。

我不知道用戶將輸入多少元素,因此我使用的是vector

請建議正確的方法來做到這一點。

回答

11

結合使用getlineistringstream來提取數字。

std::string input; 
getline(cin, input); 
std::istringstream iss(input); 
int temp; 
while(iss >> temp) 
{ 
    yourvector.push_back(temp); 
} 
+0

但是這種方法需要我不知道的streamsize。你能發表一個示例代碼嗎? – Asha 2011-03-31 08:52:09

+0

Oops..ok,我現在用@templatetypedef例子得到了它。你指的是自由函數'geline'而不是'cin.getline'。 – Asha 2011-03-31 08:55:33

+0

用代碼編輯。 – jonsca 2011-03-31 08:56:12

7

要在jonsca的回答闡述,這裏是一個可能性,假設用戶忠實輸入有效的整數:

string input; 
getline(cin, input); 

istringstream parser(input); 
vector<int> numbers; 

numbers.insert(numbers.begin(), 
       istream_iterator<int>(parser), istream_iterator<int>()); 

這將正確地閱讀和cin解析整數的有效行。請注意,這是使用免費功能getline,它與std::string s一起使用,而不是istream::getline,它與C樣式字符串一起使用。

1

這段代碼應該幫助你,它讀取一行到一個字符串,然後遍歷它得出所有數字。

#include <iostream> 
#include <sstream> 
#include <string> 

int main() { 
    std::string line; 
    std::getline(std::cin, line); 
    std::istringstream in(line, std::istringstream::in); 
    int n; 
    vector<int> v; 
    while (in >> n) { 
     v.push_back(n); 
    } 
    return 0; 
} 
1

提示用戶提示每個號碼或提前計數並相應循環。 不是一個好主意,但我在很多應用程序中看到了這一點。

1

此外,可能有助於您瞭解可以刺激EOF - 在輸入完成後,在命令行中按「ctrl-z」(僅窗口,類似unix的系統使用ctrl-d)。當你測試這樣的小程序時應該能夠幫助你 - 而不必輸入無效的字符。

+0

這將是Unix-like系統上的Ctrl-d。 – 2011-03-31 17:34:38

+0

忘了'回合 - ack'd +編輯。 – Schnommus 2011-03-31 20:26:33

相關問題