一行输入多个数字

7
我想知道如何在一行上接受多个数字,而不需要事先准确地知道数量。
例如,如果我输入 1 2 3 4,我可以使用以下方法:
std::cin >> a >> b >> c >> d;

但是如果我不知道数量是4,那么我就不能使用这种方法。将输入存储到向量中的正确方式是什么?

程序中的值只能在程序开始时输入,还是可以在程序执行期间的任何时候输入? - jlouzado
3个回答

10

您可以使用类型为std::string的对象读取所有输入,直到新行字符,然后从该字符串中提取数字,并将它们放入例如向量中。

这里有一个可供使用的示例:

#include <iostream>
#include <sstream>
#include <iterator>
#include <string>
#include <vector>

int main() 
{
    std::string s;

    std::getline( std::cin, s );

    std::istringstream is( s );

    std::vector<int> v( ( std::istream_iterator<int>( is ) ), std::istream_iterator<int>() );

    for ( int x : v) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

如果您要输入一行数字:
1 2 3 4 5 6 7 8 9 

那么从向量中输出的程序将会是:
1 2 3 4 5 6 7 8 9 

在这个程序中,你可以替换语句。
std::vector<int> v( ( std::istream_iterator<int>( is ) ), std::istream_iterator<int>() );

循环

std::vector<int> v;
int x;

while ( is >> x ) v.push_back( x );

0

main.cc

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <sstream>

int main() {
    std::vector<int> vec;

    std::string line;
    if(!std::getline(std::cin, line)) return 1;
    std::istringstream iss(line);

    std::copy(std::istream_iterator<int>(iss),
        std::istream_iterator<int>(),
        std::back_inserter(vec));

    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, ", "));

    return 0;
}

标准输入

1 2 3 4 5

标准输出

1, 2, 3, 4, 5,

https://ideone.com/FHq4zi


你需要使用 CTRL+D 终止输入,或者使用 getline() 获取单行文本再进行分词。 - bobah

-2
将其放入循环中:
int x;
while ( cin>>x )
  vec.push_back(x);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接