Getline()总是接受输入

Getline() always takes input

本文关键字:输入 Getline      更新时间:2023-10-16

我正在从我的网络摄像头捕捉视频,如果用户按下回车键,我就拍照。然后我问用户"图片还可以吗?"并等待输入。如果他说"不",我就继续做同样的事情,直到他说"是"。

但是如果他说"没有",同时我在终端上输入了一些东西,getline()函数会将我输入的任何东西写入它的缓冲区,当我再次问这个问题时,它直接进入"无效输入"状态。

如何预防?

我读了很多关于这个的问题,我试着在调用getline()之前/之后使用cin.ignore()和cin.clear(),但是它们没有帮助。

    // Do capturing here
    string choice;    
    int choiceIsOkay = 0;
    while (choiceIsOkay == 0)
    {
        cout << "Is the picture okay? (Y/N): "; 
        getline(cin, choice);
        if ((choice == "Y") || (choice == "y"))
        {
            choiceIsOkay = 2;
        }
        else if ((choice == "N") || (choice == "n"))
        {
            choiceIsOkay = 1;
        }
        else
        {
            cout << "nInvalid inputn";
            choiceIsOkay = 0;
        }
    }
if (choiceIsOkay == 2)
{
    runAlgorithm = 1;
    break;
}
else choiceIsOkay = 0;

如果我理解你的问题,如果用户输入Some Random Text In,你的程序总是跳到"无效输入",永远不会停止等待用户输入。下面的代码应该可以解决您的问题。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int runAlgorithm;
    // Do capturing here
    int i = 0;
    while (i++ < 3)
    {
        int choiceIsOkay = 0;
        string choice;
        while (choiceIsOkay == 0)
        {
            cout << "Is the picture okay? (Y/N): ";
            getline(cin, choice);
            if ((choice == "Y") || (choice == "y"))
            {
                choiceIsOkay = 2;
            }
            else if ((choice == "N") || (choice == "n"))
            {
                choiceIsOkay = 1;
            }
            else
            {
                cout << "nInvalid inputn";
                choiceIsOkay = 0;
            }
            // Ignore to the end of line
            cin.clear();
        }
    }
    return 0;
}