C++ getline函数的意外行为
我的程序中有一个循环,它将电话号码读取为字符串:C++ getline函数的意外行为,c++,C++,我的程序中有一个循环,它将电话号码读取为字符串: while (loop) { cout << "Telefone (0 para sair):" << endl; string phone; getline(cin, phone); // .. some logic while (loop2) { // .. more logic getline(cin, option); //
while (loop) {
cout << "Telefone (0 para sair):" << endl;
string phone;
getline(cin, phone);
// .. some logic
while (loop2) {
// .. more logic
getline(cin, option);
// .. more logic
}
}
while(循环){
cout在再次尝试输入之前,可能需要使用cin.clear()或cin.ignore()
更多说明:
这只是我的经验,但根据本线程中的jrok:
“提取操作在流中保留尾随的'\n'字符。另一方面,istream::getline()会丢弃它。因此,当在提取运算符之后调用getline时,'\n'是它遇到的第一个字符,它会立即停止读取。请在getline调用提取之前将其放在后面:cin.ignore()”您声称以下循环不要求电话
输入,这高度表明std::getline()
由于前导空格而无法生成字符。我怀疑您在实际代码中执行了一些格式化提取,在流中留下了新行。未格式化提取程序std::getline()
在获取换行符时对输入进行分隔,这就是您遇到这种行为的原因
这个问题的解决方案总是清除前导空格。这是使用操纵器std::ws
:
std::getline(std::cin >> std::ws, phone);
// ^^^^^^^^^^^^^^^^^^^
注:我在回答中详细讨论了这一点
您还应该检查输入是否成功。这意味着将提取包含在if
语句中,以便确定它是否成功生成字符:
if (std::getline(std::cin >> std::ws, phone))
{
// ...
}
@Nowayz,除了隐含的using指令之外,我看不出它有任何问题。@LuizEduardoF.,真正有帮助的是a。在这一点上,我们只能猜测。@Nowayz不,那是成员函数std::istream::getline()
,而不是全局std::getline()
。循环条件是什么?您可能想使用getline或其他返回流作为循环条件的函数。@现在,不,只有一个。OP声明,如果未使用getline
,输入不能包含空格,因此必须使用getline
。这有点像是一个尝试性的解决方案,但看起来很简单请仔细考虑一下不值得尝试的解决方案。也许您可以解释一下原因?这只是根据我的经验,但根据本线程中的jrok:,“提取操作在流中留下结尾的'\n'字符。另一方面,istream::getline()丢弃它。因此,当您在提取运算符之后调用getline时,“\n”是它遇到的第一个字符,并且它会立即停止读取。请在getline调用提取之前将其放在后面:cin.ignore()我想在你的回答中解释原因。这只是给出了解决方案,而不是解释。你的评论很好,你可以在你的回答中添加这一点。