而循环将永远进行(C+;+;) 我对C++仍然很陌生,只是在实验语言。

而循环将永远进行(C+;+;) 我对C++仍然很陌生,只是在实验语言。,c++,C++,我最近创建了一个“Tictatcoe”游戏 我创建了这个简单的函数来获取用户板的位置(从1到9)。它似乎工作良好,但我发现了一个奇怪的错误,所以称之为 每当我输入一个12位数或更高的数字时,循环就会一直打印“无效位置!”然后进入下一行“选择你的位置1-9:” 我正在使用VisualStudio编写代码。它是与代码有关的还是完全没有问题?我很想知道,并从中学习 下面是函数: int getUserPosition() { int position; while (true)

我最近创建了一个“Tictatcoe”游戏

我创建了这个简单的函数来获取用户板的位置(从1到9)。它似乎工作良好,但我发现了一个奇怪的错误,所以称之为

每当我输入一个12位数或更高的数字时,循环就会一直打印“无效位置!”然后进入下一行“选择你的位置1-9:”

我正在使用VisualStudio编写代码。它是与代码有关的还是完全没有问题?我很想知道,并从中学习

下面是函数:

int getUserPosition()
{
    int position;
    while (true)
    {
        cout << " Choose your position 1-9: " << endl;
        cin >> position;
        if (position < 1 or position > 9)
        {
            cout << "Invalid position!" << endl;
        }
        else if (board[position - 1] == 'X')
        {
            cout << "This position has been taken!" << endl;
        }
        else
        {
            return position;
            break;
        }
    }
}
int getUserPosition()
{
内部位置;
while(true)
{
cout位置;
如果(位置<1或位置>9)
{

我终于理解了这里的实际行为。这不是调用未定义的行为,而是您不想要的已定义的行为

cin >> position;
这试图读取12位数字,该数字不适合整数,因此读取失败。由于格式错误导致读取失败,12位数字保留在缓冲区中,因此下一次循环尝试再次读取


始终使用
cin::getline()
当您打算读取键盘输入时。
cin
中的错误/清除逻辑不是为重新同步键盘输入而设计的,而是为从无法读取错误消息的生成器管道中重新同步输入而设计的。
cin
与管道一起使用时,最好的解决方案是检查
cin::fail()
并在程序设置好后退出。

您不应该“尝试”在C++中,这不是很好的结束。首先从一本好书中学习基础知识。在代码> CIN >位置之后测试流状态;< /代码>你不知道你是否读到了好的数据。如果你读坏的数据,你想丢弃坏的数据和代码<清零>代码>在继续之前的错误标志。{do stuff with position}否则{clean bad input}
不要使用
>
进行用户输入。它与
scanf
有相同的问题。而且,
return
之后的代码是不可访问的。@SzczureX“我更喜欢从项目和错误中学习”我想说的主要是,有很多错误看起来很有效,但仍然是未定义的行为。其中一些错误非常微妙。此外,你很可能会自学坏习惯,因为做事情的好方法并不总是通过反复试验就能找到。你用过调试器来调查发生了什么吗发生了什么?如果你更喜欢动手学习,调试器是必不可少的。