C++ 为向量输入的优雅解决方案<;int>;

C++ 为向量输入的优雅解决方案<;int>;,c++,vector,cin,getline,istringstream,C++,Vector,Cin,Getline,Istringstream,我正在尝试创建一个大小不是预定义的向量。只要输入终端中有数字,它就应该接收数字,并且在我点击Enter时应该停止读取。我尝试了许多解决方案,包括给出的和。在第二种情况下,我可以输入一个非整数来终止向量的输入。如果我使用第一个解决方案(下面添加的代码),它将无限期地侦听输入 代码: #包括 #包括 #包括 #包括 #包括 使用std::cout; 使用std::cin; 使用std::vector; 使用std::string; 使用std::istringstream; int main() {

我正在尝试创建一个大小不是预定义的
向量。只要输入终端中有数字,它就应该接收数字,并且在我点击
Enter
时应该停止读取。我尝试了许多解决方案,包括给出的和。在第二种情况下,我可以输入一个非整数来终止向量的输入。如果我使用第一个解决方案(下面添加的代码),它将无限期地侦听输入

代码:

#包括
#包括
#包括
#包括
#包括
使用std::cout;
使用std::cin;
使用std::vector;
使用std::string;
使用std::istringstream;
int main()
{
//cout(输入)
{
arr.push_back(输入);
}
}

cout请参见@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;
}
#包括
#包括
#包括
#包括
#包括
使用std::cout;
使用std::cin;
使用std::vector;
使用std::string;
使用std::istringstream;
int main()
{
向量arr;
字符串buf;
int输入;
cout>输入)
{
arr.push_back(输入);
}

让我们一步一步来

我们想一直读到按下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 (...) {}
}
std::字符串行;
std::getline(填充,行);
std::istringstream输入(行);
字符串字;
std::矢量输出;
while(输入>>单词){
试一试{
int i=标准::stoi(字);
输出。推回(i);
}
捕获(…){}
}
例如,给定诸如“123A456321111123342343434343432343223444 9”之类的输入,这将读入[1233219]


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

“有没有办法检测键盘输入”。getline()默认情况下,does使用Enter,即“\n”作为delimeter。因此,它读取一行输入并在Enter上退出。与您在while()中所做的相同,但在
while()中我有
getline()
)<代码> >我不确定我理解了你的意思。在<<代码>中输入<代码> GETLION>代码> 意味着你想要保持所有的行直到输入被关闭。但是在你的问题中,听起来你想在得到一行之后停下来。如果你在寻找优雅,你选错了语言。我已经得到了我想要的。从注释中。但是+1用于使用
try catch
块来捕捉边缘案例。@skr\u robo:您的答案甚至与您在问题中要求的内容相差甚远。例如,给定此处显示的输入,它将只读
123
,并因“a”而停止,正如你在问题中指出的那样。我通过输入
1234
作为输入进行测试,然后输入
Enter
。它停止了听输入。早些时候,我必须输入类似
1234a
的内容才能得到相同的结果。如果我问题中的措词造成任何混乱,我很抱歉。我已经重新阅读了你的答案。我理解你的观点“例如,如果输入“123a456 321 11112334234343434343234322344 9”,这将在[123,321,9]中读取。”但我不是为了这个。很抱歉混淆了。
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 (...) {}
}