Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ getline函数的意外行为_C++ - Fatal编程技术网

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()我想在你的回答中解释原因。这只是给出了解决方案,而不是解释。你的评论很好,你可以在你的回答中添加这一点。