C++ 我怎样才能只使用一次cin?

C++ 我怎样才能只使用一次cin?,c++,C++,我想在一行中从用户那里得到多个数字,并将其存储在一个向量中。我就是这样做的: vector<int> numbers; int x; while (cin >> x) numbers.push_back(x); 它将数字放入向量中,然后等待更多的输入,这意味着我必须输入Ctrl+Z才能退出循环。如何在获得一行整数后自动退出循环,以便不必输入Ctrl+Z?实现这一点的最简单方法是使用字符串流: #include <sstream> //.... st

我想在一行中从用户那里得到多个数字,并将其存储在一个向量中。我就是这样做的:

vector<int> numbers;
int x;
while (cin >> x)
    numbers.push_back(x);

它将数字放入向量中,然后等待更多的输入,这意味着我必须输入
Ctrl+Z
才能退出循环。如何在获得一行整数后自动退出循环,以便不必输入
Ctrl+Z

实现这一点的最简单方法是使用字符串流:

#include <sstream>
//....

std::string str;
std::getline( std::cin, str ); // Get entire line as string
std::istringstream ss(str);

while ( ss >> x ) // Now grab the integers
    numbers.push_back(x); 
更新

while (std::cin.peek() != '\n') {
    std::cin >> x;
    numbers.push_back(x);

    // workaround for problem from comment
    int tmp;
    while (!isdigit(tmp = std::cin.peek()) && tmp != '\n') {
      std::cin.get();
    }
}

您是在每个数字后按enter键还是这只是一行?@MichałWalenciak这是一行将一行输入(
getline
)读入
string
,然后使用字符串流将字符串中的数据转换为数字。如果您想这样读取,请使用
getline
读取字符串,然后你必须在
''
上拆分
。我的C++没有一个你可以很容易地编写你自己的。一个答案(Linux)是按<代码> CTRL D < /C>(文件结尾)而不是<代码> CTRL z 。这和POW的解决方案不一样——在最后一个数字之后,在新行中断之前,任何空格/制表符,如果
std::cin>>x
转换失败(例如,行中的一些文本),它就会陷入循环中。@flaggers:flags并不用于验证代码问题的正确性。这两个“解决方案”都被严重破坏,因为它们使用
std::cin>>x
的结果,而不测试输入是否有效。我知道,这只是为了演示如何填充向量。测试输入是另一个问题。为什么
std::stringstream
,而不是
std::istringstream
?(我不记得曾经使用过
std::stringstream
)另外:我已经做了一些事情来验证格式;事实上,如果一行包含
“1 2 x 4”
,代码将解析1和2,然后停止而不指示错误。(在循环后检查
ss.eof()
是否为真就足够了。)@JamesKanze 1)使用
std::istringstream
,我有时会盲目地对输入和输出操作使用
std::stringstream
,可能类似于
std::fstream
2)添加了检查,谢谢你:我想我也从来没有用过
std::fstream
。(通常,当我读写流时,我会使用本机函数:
open
read
write
lseek
close
,或者它们在Windows中的等效函数。)
if( !ss.eof() )
{
   // Invalid Input, throw exception, etc
}
while (std::cin.peek() != '\n') {
    std::cin >> x;
    numbers.push_back(x);
}
while (std::cin.peek() != '\n') {
    std::cin >> x;
    numbers.push_back(x);

    // workaround for problem from comment
    int tmp;
    while (!isdigit(tmp = std::cin.peek()) && tmp != '\n') {
      std::cin.get();
    }
}