c++ - 将输入输入到 vector<int> 的优雅解决方案

标签 c++ vector cin getline istringstream

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

代码:

#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() , 但它改变了 vector 中的数字。

3) 还有其他方法或建议吗?

最佳答案

让我们一步一个脚印。

我们想一直读到 enter 被按下。这意味着您可能想要使用 std:getline 来读取一行。

然后你想解析它,所以你想把这行放到一个 istringstream 中。

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

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

同样,如果你得到类似“123a456”的东西,你想做什么?是否应该完全跳过它,读作“123”(并忽略“a456”)?是否应该读作“123”和“456”,而只忽略“a”?

目前让我们假设我们要读取以空格分隔的字符组,并将所有这些字符转换为我们可以转换的数字。如果某物太大而无法转换为数字,我们将忽略它(全部)。如果我们有一个像“123a456”这样的组,我们会将“123”读作一个数字,而忽略“a456”。

为了实现这一点,我们可以这样做:

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 (...) {}
}

例如,给定如下输入:“123a456 321 1111233423432434342343223344 9”,这将读入 [123, 321, 9]。

当然,我只是猜测您的要求,我并没有努力让它变得特别干净或优雅——只是对一组可能的要求的直接实现。

关于c++ - 将输入输入到 vector<int> 的优雅解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838510/

相关文章:

c++ - 将 vector 初始化为零

c++ - 在继续之前,Cin 不会让用户在控制台中输入任何内容

c++ - std::cin 错误输入的无限循环

c++ - 重载 operator new - 误导性输出

c++ - 如何输入某个文件,同时将某些部分分配到不同的变量中

c++ - 在 Eclipse 中向 'link' 命令添加引号

c++ - 允许用户跳过输入并直接按 Enter 键

c++ - std::vector 的性能差是因为没有调用 realloc 的对数次数吗?

c++ - 启用 -std=c++0x 时自定义分配器的编译问题

c++ - do-while 中的输入验证