Getline() รับอินพุตเสมอ

ฉันกำลังจับภาพวิดีโอจากเว็บแคมของฉัน และหากผู้ใช้กดปุ่ม Enter ฉันจะถ่ายภาพ แล้วถามว่า "รูปโอเคไหม?" ให้กับผู้ใช้และรออินพุต ถ้าเขาตอบว่า "ไม่" ฉันก็จะทำแบบเดิมต่อไป จนกว่าเขาจะตอบว่า "ใช่"

แต่ถ้าเขาพูดว่า "ไม่" และในระหว่างนี้ ฉันพิมพ์บางอย่างในเทอร์มินัล ฟังก์ชัน getline() จะเขียนสิ่งที่ฉันพิมพ์ลงในบัฟเฟอร์ และเมื่อฉันถามคำถามอีกครั้ง มันจะไปที่สถานะ "อินพุตไม่ถูกต้อง" โดยตรง

ฉันจะป้องกันสิ่งนี้ได้อย่างไร?

ฉันได้อ่านคำถามมากมายเกี่ยวกับเรื่องนี้และฉันพยายามใช้ cin.ignore() และ cin.clear() ก่อน/หลังหลังจากที่ฉันโทรไปที่ getline() แต่พวกเขาไม่ได้ช่วยอะไร

    // 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 input\n";
            choiceIsOkay = 0;
        }
    }

if (choiceIsOkay == 2)
{
    runAlgorithm = 1;
    break;
}

else choiceIsOkay = 0;

person massakrienen    schedule 25.10.2015    source แหล่งที่มา
comment
นี่คือสิ่งที่คาดหวัง เหตุใดคุณจึงพิมพ์สิ่งต่าง ๆ เมื่อโปรแกรมของคุณคาดหวังเพียงอินพุต ENTER และ Y/N   -  person Dúthomhas    schedule 26.10.2015
comment
@Dúthomhasโดยไม่ได้ตั้งใจ ฉันอยากจะใช้ความระมัดระวังทุกประการ   -  person massakrienen    schedule 26.10.2015
comment
อ่าโอเค. คุณสามารถทำอะไรได้ไม่มากนอกจากต้องการให้ผู้ใช้ใส่ใจกับสิ่งที่พวกเขาพิมพ์ คุณสามารถเพิกเฉยต่ออะไรก็ได้ยกเว้น 'Y' หรือ 'N' สุดท้าย   -  person Dúthomhas    schedule 26.10.2015


คำตอบ (1)


ถ้าฉันเข้าใจปัญหาของคุณ หากผู้ใช้ป้อน 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;
}
person manman    schedule 26.10.2015