将输入传递给vector <int>的优雅解决方案

时间:2017-06-30 04:16:33

标签: c++ vector cin getline istringstream

我正在尝试创建一个大小未预先定义的vector <int>。只要输入终端中有数字,就应该输入数字,并且当我点击Enter时应该停止读取。我尝试了很多解决方案,包括herehere。在第二种情况下,我可以输入一个非整数来终止向量的输入。如果我使用第一个解决方案(下面添加的代码),它会无限期地监听输入。

代码:

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

using std::cout;
using std::cin;
using std::vector;
using std::string;
using std::istringstream;

int main()
{
    //cout << "Enter the elements of the array: \n";
    //vector <int> arr ( std::istream_iterator<int>( std::cin ), std::istream_iterator<int>() );
    vector <int> arr;
    string buf;
    cout << "Enter the elements of the array: \n";
    while(getline(cin, buf))
    {
        istringstream ssin(buf);
        int input;
        while(ssin >> input)
        {
            arr.push_back(input);
        }
    }

    cout << "The array: \n";
    for(size_t i = 0; i < arr.size(); i++)
    {
        cout << arr[i] << " ";
    }
    return 0;
}

1)我不觉得输入一个字符或一个非常大的数字来结束听取输入是非常优雅的。但是,istringstream的解决方案似乎是要走的路。我不确定为什么它不起作用。

2)有没有办法从键盘检测Enter以终止听取输入?我尝试使用cin.get(),但它更改了向量中的数字。

3)任何其他方法或建议?

2 个答案:

答案 0 :(得分:1)

让我们一步一步。

我们希望在按下 enter 之前阅读。这意味着您可能希望使用std:getline来读取一行。

然后你要解析它,所以你想把这行放到istringstream

然后你想读数字。当你正在阅读它们时,你显然想要忽略除数字以外的任何内容,并且即使你得到一组无法转换为数字的数字,你仍然希望继续阅读。

这留下了一些并不完全清楚的事情,例如如何处理那些太大而无法转换的输入?你想跳到下一个吗?您想读取一些数字作为数字,然后将剩余数字作为另一个数字读取吗?

同样,如果你得到像&#34; 123a456&#34;?这样的话你想做什么?如果完全跳过,请阅读&#34; 123&#34; (&#34; a456&#34;被忽略)?它应该被理解为&#34; 123&#34;和&#34; 456&#34;,只是&#34; a&#34;忽略?

暂时让我们假设我们要读取以空格分隔的字符组,并将所有字符转换为我们可以使用的数字。如果某些东西太大而无法转换为数字,我们将忽略它(完整地)。如果我们有一个像&#34; 123a456&#34;这样的小组,我们会阅读&#34; 123&#34;作为一个数字,并忽略&#34; a456&#34;。

为实现这一目标,我们可以这样做:

std::string line;
std::getline(infile, line);

std::istringstream input(line);

std::string word;
std::vector<int> output;

while (input >> word) {
    try {
        int i = std::stoi(word);
        output.push_back(i);
    }
    catch (...) {}
}

例如,给定输入如:&#34; 123a456 321 1111233423432434342343223344 9&#34;,这将在[123,321,9]中读取。

当然,我只是猜测你的要求,而且我还没有努力使这个特别干净或优雅 - 只是直接实现一套可能的要求。

答案 1 :(得分:0)

请参阅@LearningC和@ M.M。

的评论
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>

using std::cout;
using std::cin;
using std::vector;
using std::string;
using std::istringstream;

int main()
{
    vector <int> arr;
    string buf;
    int input;
    cout << "Enter the elements of the array: \n";
    getline(cin, buf);
    istringstream ssin(buf);
    while(ssin >> input)
    {
        arr.push_back(input);
    }

    cout << "The array: \n";
    for(size_t i = 0; i < arr.size(); i++)
    {
        cout << arr[i] << " ";
    }
    return 0;
}