我正在尝试从控制台读取空格分隔数字到vector<int>
这个简单的任务,但我不知道如何正确地执行此操作。
这是我到目前为止所做的事情:
int n = 0;
vector<int> steps;
while(cin>>n)
{
steps.push_back(n);
}
但是,这需要用户按下无效字符(例如a
)来中断while
循环。我不想要它。
只要用户输入0 2 3 4 5
等数字并按Enter
,我就希望循环被破坏。我也尝试使用istream_iterator
和cin.getline
,但我无法使用它。
我不知道用户将输入多少元素,因此我正在使用vector
。
请建议正确的方法。
答案 0 :(得分:11)
使用getline
与istringstream
相结合来提取数字。
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)
在每个号码后提示用户或提前取数量并相应地循环。 不是一个好主意,但我在许多应用程序中看到了这一点。