如何从控制台读取空格分隔数字?

时间:2011-03-31 08:45:26

标签: c++ stl iostream

我正在尝试从控制台读取空格分隔数字到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

请建议正确的方法。

5 个答案:

答案 0 :(得分:11)

使用getlineistringstream相结合来提取数字。

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

答案 1 :(得分:8)

详细说明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一起使用,而不是istream::getline,它适用于C风格的字符串。

答案 2 :(得分:2)

这段代码应该可以帮助你,它会读取一个字符串的行,然后迭代它以获取所有数字。

#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;
}

答案 3 :(得分:2)

此外,可能有助于知道您可以激发EOF - 在完成输入后,在命令行中按“ctrl-z”(仅限Windows,类似unix的系统使用ctrl-d)。当您测试这样的小程序时,应该帮助您 - 无需键入无效字符。

答案 4 :(得分:1)

在每个号码后提示用户或提前取数量并相应地循环。 不是一个好主意,但我在许多应用程序中看到了这一点。