std::cin上的std::getline

8

有没有什么好的理由:

std::string input;
std::getline(std::cin, input);

getline调用不会等待用户输入吗?cin的状态是否有问题?


4
请发布您的代码,以获得能解决您问题的答案,而非推测性的回答。在翻译过程中,我没有改变原意,也没有添加任何额外的信息。 - Alok Save
之前输入缓冲区里有 '\n' 吗? - hammar
1
当然,这种情况发生的原因是有充分的理由的 - 你在某些方面搞砸了 :-) 发布更多能够展示问题的代码(正如其他人所提到的)。 - Praetorian
cin 允许进行缓冲。许多实现需要一个 换行符 来清空输入缓存并将数据返回给调用程序。 - Thomas Matthews
3
这个回答解决了你的问题吗?为什么std::getline()在格式化提取后会跳过输入? - user202729
4个回答

7

很可能您在读取其他数据(例如int)之后尝试读取字符串。

考虑以下输入:

11
is a prime

如果你使用以下代码:
std::cin>>number;
std::getline(std::cin,input)
getline 只会读取 11 后面的换行符,因此你会认为它没有等待用户输入。解决这个问题的方法是使用一个虚拟的 getline 函数来消耗数字后面的换行符。

6
更好的解决方法是始终使用std::getline来读取任何输入,而不是使用std::cin >> 风格的输入。如果要读取一个整数,您可以将该行读入字符串缓冲区,然后解析该缓冲区以获取整数(例如使用std::stringstream)。 - Sander De Dycker
2
除了使用虚拟getline调用之外,消除额外的'\n'的另一种方法是使用cin.ignore(1, '\n') - Sven
5
@Als:这被称为心理调试,即先前遇到过某个问题,因此知道它可能的原因。 :) 当然,可能是其他问题,但尝试根据可用信息和自己的经验进行回答并没有什么坏处。 - Sven
2
哇!哈菲兹先生,你的ESP能力太可怕了。谢谢! - ForeverLearning
3
我能几乎保证这就是 OP 面临的问题。我已经看到这个问题数百次了,而且每一次都是因为在调用 getline 之前调用了 operator>>,导致输入缓冲区中留下了一个 '\n'。 - Benjamin Lindley
显示剩余4条评论

1
我已经测试了以下代码,它正常工作。
#include <iostream>
using namespace std;
int main()
{
    string  input;
    getline(cin, input);
    cout << "You input is: " << input << endl;
    return 0;
}

我猜想在你的程序中,可能已经有一些输入内容存储在输入缓冲区中了。

1

这段代码不起作用:

#include <iostream>
#include <string>

int main()
{
int nr;
std::cout << "Number: ";
std::cin >> nr;

std::string  input;
std::cout << "Write something: ";
getline(std::cin, input);
std::cout << "You input is: " << input << std::endl;

return 0;
}

现在它可以工作了:

#include <iostream>
#include <string>

int main()
{
int nr;
std::cout << "Number: ";
std::cin >> nr;

std::string x;
std::getline(std::cin,x);

std::string  input;
std::cout << "Write something: ";
getline(std::cin, input);
std::cout << "You input is: " << input << std::endl;

return 0;
}

根据权威来源(特别是我的意见),这是解决这个众所周知的问题的可接受方式。 - asianirish

0
这是因为在 std::getline(std::cin, input); 之前有一个换行符 (/n)。getline 会读取直到遇到 /n。因此它会读取一个空字符串并返回 null,而不会等待用户输入。
为了解决这个问题,我们可以使用一个虚拟的 getline,或者 cin.ignore(1, /n);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接