首页 > 解决方案 > 设置循环等待用户输入(C++)

问题描述

我试图让一个简单的井字游戏程序在控制台中运行,以确保我理解循环和数组。

它可以按预期编译和运行,但如果用户输入的不是数字,则程序会if无限地遍历第一条语句,而没有机会添加新的输入。我真的看不出如何解决这个问题。

我认为问题在于它chosenSquare是一个整数,因为它需要与值进行比较,但cin可以接受任何内容。预期的行为是检查输入是否是 0 到 8 之间的整数(板上的 9 个空格),并且如果不返回消息并重复,则等待新的输入。

有一个简单的解决方法吗?在我了解基础知识的同时,我现在正在尝试避免使用专业包和名称空间。我看过类似的问题,但没有关注它们。

谢谢。

代码片段:

 // Input loop
    bool valid = false;
    while (valid != true)
    {
        int chosenSquare = 0;
        cout << "Player " << currentPlayer << ", enter a number between 1 and 9:" << endl;
        cin >> chosenSquare;
        chosenSquare--; // For array indexing

        if ((chosenSquare < 0) || (chosenSquare > 8)) // <--- PROBLEM IS THIS LOOP
        {
            cout << "Invalid input. Try again." << endl;
            continue;
        }
        else if ((board[chosenSquare] == currentPlayer) || (board[chosenSquare] == lastPlayer))
        {
            cout << "Square not availible. Try again." << endl;
            continue;
        }
        else
        {
            board[chosenSquare] = currentPlayer;
            valid = true;
            break;
        }
    }

标签: c++

解决方案


有几件事最终导致了这种情况。

第一个是当一个字母字符被放入控制台时,错误位被设置,并且0 被写入你正在写入的变量

您想要观察的行为在 2011 年发生了变化。在那之前:

如果提取失败(例如,如果在需要数字的地方输入了一个字母),则值保持不变并设置失败位。

但是从 C++11 开始:

如果提取失败,则将零写入 value 并设置 failbit。[...]

(来自cppr。)

这意味着chosenSquare0在阅读之后,所以chosenSquare--使它-1-1,如您所知,小于0,所以第一个 if 语句为真。

至于为什么它会无限保持这种状态,您需要清除 fail-bit


推荐阅读