0

我有一个 while 语句,它不断重复文本,而不给用户输入另一个操作值的机会。我究竟做错了什么?它仍然不要求输入。我需要代码显示一次文本,然后要求输入。据推测,如果您键入除 1 以外的任何内容,它会重复该序列。但就目前而言,它只是将您踢出循环,而没有机会纠正动作(截至上次编辑,见下文。)

int action = 0;
while (action != 1)
{ 
    cout << " No you must look it might be dangerous" << endl;
    cin >> action;
}

一个建议是:

while (action != 1)
{ 
    cout << " No you must look it might be dangerous" << endl;
    cin >> action;
    cin.ignore();
}

这仍然会一遍又一遍地产生文本。

while (action != 1)
{ 
    cout << " No you must look it might be dangerous" << endl;
    if (!(cin >> action))
        // ...problems in the I/O stream...
        break;
}

这会在没有机会输入新动作的情况下将您踢出去。

4

1 回答 1

2

如果您键入的字符不是空格且不能是整数的一部分,则您将进入无限循环。每次尝试输入到action无效字符都会失败,而不会更改存储在action.

你可以写:

int action = 0;
while (action != 1)
{
    cout << " No you must look it might be dangerous" << endl;
    if (!(cin >> action))
        // ...problems in the I/O stream...
        break;
}

这将比连续循环更优雅地处理 EOF 和字母字符。您可能需要设置标志或从函数返回错误条件,或执行除跳出循环之外的其他操作。始终检查您的输入是否成功。

您可能还考虑输出您在action循环中存储的值,这样您就可以看到发生了什么:

int action = 0;
while (action != 1)
{
    cout << " No you must look it might be dangerous" << endl;
    if (!(cin >> action))
        // ...problems in the I/O stream...
        break;
    cerr << "Action: " << action << endl;
}

这也可能告诉你一些有用的东西。


请展示一个完整的小程序来说明您的问题 - SSCCE(简短、独立、正确的示例)。

例如,我正在测试:

#include <iostream>
using namespace std;

int main()
{
    int action = 0;
    while (action != 1)
    {
        cout << " No you must look it might be dangerous" << endl;
        if (!(cin >> action))
        {
            // ...problems in the I/O stream...
            break;
        }
        cout << "Action: " << action << endl;
    }
    cout << "After loop" << endl;
    if (!cin)
        cout << "cin is bust" << endl;
    else
        cout << "Action: " << action << endl;
}

这不再是最少的代码——循环之后的材料只是告诉我发生了什么。但它确实帮助我确保我的代码符合我的预期。

你的等效代码是什么样的,你在输入什么来响应提示——尤其是在你到达这个代码片段之前你在输入什么(以及在你到达这里之前正在发生什么其他输入活动)?

于 2013-07-27T22:53:11.180 回答