std :: getline on std :: cin

For*_*ing 6 c++ cin getline

有什么好的理由可以解释:

std::string input;
std::getline(std::cin, input);
Run Code Online (Sandbox Code Playgroud)

getline调用不会等待用户输入?cin的状态是否以某种方式搞砸了?

Sha*_*fiz 6

很可能你在读完一些其他数据后试图读取一个字符串,比如说int.

考虑输入:

11
is a prime
Run Code Online (Sandbox Code Playgroud)

如果您使用以下代码:

std::cin>>number;
std::getline(std::cin,input)
Run Code Online (Sandbox Code Playgroud)

getline将只读取换行符11后,因此你会得到的印象是,它不是等待用户输入.

解决此问题的方法是使用虚拟对象getline来消耗数字后面的新行.

  • 解决这个问题的一个更好的方法是始终使用`std :: getline`来读取任何输入,而不要使用`std :: cin >>`样式输入.对于读取int,您可以读取字符串缓冲区中的行,然后解析该缓冲区以获取其中的int(使用`std :: stringstream`例如.). (6认同)
  • @Als:它被称为通灵调试,即之前已经看过问题,因此知道其可能的原因.:)当然,它可能是别的东西,但根据可用的信息和自己的经验尝试回答没有坏处. (5认同)
  • 摆脱额外'\n'而不是虚拟getline调用的另一种方法就是`cin.ignore(1,'\n');`. (2认同)
  • 答对了!哈菲兹先生,你的ESP能力是可怕的.谢谢! (2认同)
  • 我几乎可以保证这*是OP面临的问题.我已经看过几百次这个问题了,它总是*因为在调用`getline`之前调用`operator >>`,在输入缓冲区中留下'\n'. (2认同)