在 C++ 中的单个输入行中读取整数列表

Posted

技术标签:

【中文标题】在 C++ 中的单个输入行中读取整数列表【英文标题】:Reading a list of integer in a single input line in C++ 【发布时间】:2012-02-19 23:03:19 【问题描述】:

我正在尝试将单个输入行中的多个整数读入一个数组 例如。输入:100 200 300 400,所以数组是:a[0] = 100, a[1] = 200, a[2] = 300, a[3] = 400 问题是,整数的个数是未知的,所以数组的大小是未知的。

【问题讨论】:

【参考方案1】:

您应该使用自动调整大小的容器,例如std::vector

例如,像这样的:

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

std::string line;
getline(instream, line);
std::istringstream this_line(line);
std::istream_iterator<int> begin(this_line), end;
std::vector<int> values(begin, end);

【讨论】:

我猜你的意思是使用 std::istream_iterator&lt;int&gt; 并且你想使用适当的括号来避免最麻烦的解析。 @DietmarKühl:感谢您指出错误的名称。这是避免大多数令人烦恼的解析的有效方法吗? 是的,它绝对避免了最麻烦的解析,但不必要地需要使用 C++2011。一个更微妙的版本是std::vector&lt;int&gt; values(std::istream_iterator&lt;int&gt;(this_line), (std::istream_iterator&lt;int&gt;()))(注意第二个参数周围的额外括号)。另外,我故意使用std::istream_iterator&lt;int&gt; 而不是istream_iterator&lt;int&gt; ;) @DietmarKühl:哦,很好,没有使用 C++11 的乐趣。 C++11 还允许使用 而不是(),以避免解析为函数声明,对吧? @BenVoigt:是的,我认为这是正确的,尽管我不完全确定:“统一初始化语法”与统一std::vector&lt;T&gt; 支持初始化列表:我还没有完全理解这些和统一初始化之间的交互。由于std::vector&lt;T&gt; 使用std::initializer_list&lt;T&gt; 这应该没问题(不过需要尝试一下)。【参考方案2】:

您可以为此使用std::vector

std::vector<int> myVector;

std::string line;
std::getline(std::cin, line);
std::istringstream os(line);

int i;
while(os >> i)
    myVector.push_back(i);

此代码需要以下内容:&lt;iostream&gt;&lt;string&gt;&lt;sstream&gt;&lt;vector&gt;

【讨论】:

请停止abusing namepsace std;。这是一个非常非常肮脏的习惯,它毁了所有新人的思想...... 我不认为它像 Kerrek 所说的那么糟糕,但示例代码应该比生产代码更原始。 @BenVoigt:我知道这不是一个好习惯,而且我滥用它真的很多,尤其是当我知道我要写超过 5 个 std:: 前缀时。他写这篇评论时做了一件好事。 @LihO:只要它s within a limited scope, using namespace std;` 就可以了。主要抱怨与“远距离操作”有关,这就是为什么在头文件中找到它特别糟糕的原因。【参考方案3】:

插入器和流迭代器可以很好地做到这一点:

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

std::vector<int> numbers;

std::copy(std::istream_iterator<int>(std::cin),
          std::istream_iterator<int>(),
          std::back_inserter(numbers));

或者,正如@Ben Voigt 所说,一次性从输入构建向量(如果可以的话):

std::vector numbers(std::istream_iterator<int>(std::cin),
                    std::istream_iterator<int>());

如果您的输入要求更复杂,您可以将std::cin 替换为合适的字符串流。

【讨论】:

嘘到std::copystd::vector 知道如何从一个范围构造自己。 这忽略了“单行”的要求。 什么双关语?您的代码读取整个标准输入流。 OP 只想要一行。 +1 使用std::cin 来回避最棘手的解析问题。不幸的是,如果流是局部变量,这将不会那么容易:在这种情况下,需要额外的一组括号。 @DietmarKühl:是的,我们不久前讨论过这个问题,我们在一个 for 循环中完成了所有事情,使用了一个临时帮助程序 std::stay(与 std::move 相反)。

以上是关于在 C++ 中的单个输入行中读取整数列表的主要内容,如果未能解决你的问题,请参考以下文章

在java中从用户获取整数数组输入

如何从 C++ 中的文本文件中逐行读取整数? [复制]

在 C++ 中按字符读取输入文件时的换行符

将列表或单个整数作为参数处理

如何在 C++ 中使用输入重定向添加整数

如何限制用户仅在 C++ 中输入单个字符