Вывести значение в консоль после do ... пока оператор удовлетворен? - PullRequest
0 голосов
/ 01 мая 2019

Я чрезвычайно новичок в C ++ и не могу понять это.Я попробовал пару вещей, но мне кажется, что я просто упускаю что-то простое.

У меня есть это консольное приложение, где пользователь вводит предопределенный пароль.Если пароль неверный, он предложит им повторно ввести пароль.Если пароль правильный, это просто завершает программу, но я хочу, чтобы он сказал "Доступ предоставлен!"затем конец.

У меня возникла побочная проблема: при вводе пароля больше, чем слово, для каждого слова печатается «Отказано в доступе».

string password;

cout << "Please enter the password!" << endl;
cin >> password;

if (password == "test") {
    cout << "Access granted!";
} else {
    do {
        cout << "Access denied! Try again." << endl;
        cin >> password;
    } while (password != "test");
}

return 0;

1 Ответ

2 голосов
/ 01 мая 2019

Вам необходимо вывести ваше сообщение "Access granted" после выхода из цикла, а также вам необходимо очищать ввод stdin после каждой неудачной попытки отбросить все слова, которые все еще ожидают чтения:

#include <limits>

string password;

cout << "Please enter the password!" << endl;
cin >> password;

if (password == "test") {
    cout << "Access granted!";
} else {
    do {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Access denied! Try again." << endl;
        cin >> password;
    } while (password != "test");
    cout << "Access granted!";
}

return 0;

Live Demo

Что было бы лучше написать так:

#include <limits>

string password;

cout << "Please enter the password!" << endl;
do {
    cin >> password;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    if (password == "test") break;
    cout << "Access denied! Try again." << endl;
}
while (true);

cout << "Access granted!";
return 0;

Демонстрационная версия

Однако обратите внимание, что operator>> читает только 1 слово за раз, поэтому что-то вроде "test I GOT IN!" также будет принято. Вы должны использовать std::getline() вместо того, чтобы читать всю строку за раз, вместо того, чтобы читать слово за раз:

#include <limits>

string password;

cout << "Please enter the password!" << endl;
do {
    getline(cin, password);
    if (password == "test") break;
    cout << "Access denied! Try again." << endl;
}
while (true);

cout << "Access granted!";
return 0;

Демоверсия

...