Запълване на безсмислени изрази в C++

Имам тази проста C++ програма за конзолно приложение във VS 2013 Express (за Windows Desktop):

#include <iostream>
#include <string>
using namespace std;

int main()
{
string mystr;
cout << "Welcome, what is your name? ";
getline(cin, mystr);
cout << "Nice to meet you, " << mystr << endl;
cout << "May i call you \"Idiot\" for short? (y/n)" << endl;

string mystr2;
getline(cin, mystr2);

while ( ??? ) 
{
    if (cin)
    {
        if (mystr2 == "y")
        {
            cout << "Thank you, Idiot" << endl;
        }
        else
        {
            if (mystr2 == mystr)
            {
                cout << "You found the hidden secret! The hidden secret is..... I dunno. It is what ever you want it to be. \n \nProbably a let down." << endl;
            }
            else
            {
                if (mystr2 == "n")
                {
                    cout << "Ok then, " << mystr << endl;
                }
                else
                {
                    cout << "Please enter a valid response (y/n)" << endl;
                    getline(cin, mystr2);
                }
            }
        }
    }
}

}

Току-що започнах да уча и предпочитам да уча, докато правя нещо, така че реших да направя това. Както може би се досещате от последния оператор else, искам да казва "Моля, въведете валиден отговор (y/n)", ако потребителят е въвел нещо различно от y, n или mystr2 == mystr. Работи добре, но трябва да го зацикля, така че съм поставил всичко в оператора while.

Сега имам нужда от израз за оператора while, който няма да го повлияе или е резултат от това, че потребителят е задействал последния оператор else. Този пълнител е това, за което имам нужда от помощ.

Знам, че е малко и безсмислено, но искам да го завърша.


person sanorpetro    schedule 15.04.2014    source източник
comment
Бих предложил да преместите и двете getline повиквания, за да станат условието.   -  person chris    schedule 15.04.2014
comment
Какво имаш предвид? @крис   -  person sanorpetro    schedule 15.04.2014
comment
Агню го изясни.   -  person chris    schedule 16.04.2014


Отговори (4)


Можете просто да използвате while(true), за да се изпълнява цикълът за неопределено време. Ако някога искате да спре, трябва break или return

person Benjamin Trent    schedule 15.04.2014
comment
Как да добавя прекъсване или връщане? - person sanorpetro; 15.04.2014
comment
@JoeJoe2416 можете просто да извикате break; във вашия цикъл навсякъде, където искате да спре. Той ще пропусне каквото и да е след него вътре в цикъла и няма да повтори отново (няма да излезе от програмата). Return 0; ще се върне в main и по този начин ще излезе от цялата програма. - person Benjamin Trent; 15.04.2014

getline връща препратка към потока, от който е чел. И всички потоци осигуряват имплицитно преобразуване в bool, което води до true, ако потокът е валиден (т.е. ако последната операция е успешна). Така че е доста идиоматично да направите това:

string mystr2;

while (getline(cin, mystr2))
{
    if (mystr2 == "y")
    {
        cout << "Thank you, Idiot" << endl;
    }
    else
    {
        if (mystr2 == mystr)
        {
            cout << "You found the hidden secret! The hidden secret is..... I dunno. It is what ever you want it to be. \n \nProbably a let down." << endl;
        }
        else
        {
            if (mystr2 == "n")
            {
                cout << "Ok then, " << mystr << endl;
            }
            else
            {
                cout << "Please enter a valid response (y/n)" << endl;
            }
        }
    }
}
person Angew is no longer proud of SO    schedule 15.04.2014

Мисля, че търсите while(true), което е просто един безкраен цикъл, докато не break или return излезете от него. Това няма да повлияе на нищо друго.

person yizzlez    schedule 15.04.2014

Мисля, че искате while(mystr2!="y" && mystr2!="n" && mystr2!=mystr) По този начин, ако входът е нещо различно от "y", "n" или mystr, той ще продължи да зацикля.

person WanderingMathematician    schedule 15.04.2014