do ... while语句满足后,将值输出到控制台。

时间:2019-05-01 18:04:40

标签: c++ console-application

我是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 个答案:

答案 0 :(得分:2)

在循环退出后,您需要输出"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;

Live Demo

但是,请注意,operator>>一次只能读取一个单词,因此也将接受"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;

Live Demo