2011-03-31 53 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

相关问题