当满足条件时,循环不会结束

时间:2019-11-13 21:03:09

标签: c++ while-loop

void getPlayerRolls(int RollValues[], int& AttemptCount) {
    int i = 0;
    int FrameNumber = 0;
    int RollNumber = 0;

    while(RollValues[i] != -1) {
        FrameNumber++;

        cout << "Frame # " << FrameNumber << endl;
        cout << "Roll #1 "
             << " ";
        cin >> RollValues[i];
        i++;

        cout << "Roll #2 "
             << " ";
        cin >> RollValues[i];
        i++;

        cout << endl;

    }
}

我的期望是,当为其中一个掷骰值输入-1时,程序将终止。我试图创建一个可以与数组一起使用的while循环,但是在确定如何执行此操作时遇到了麻烦。

1 个答案:

答案 0 :(得分:2)

我从您的函数中删除了不属于问题的行,但这也许可以澄清:

while(RollValues[i] != -1) {
    cin >> RollValues[i];
    i++;
    cin >> RollValues[i];
    i++;
    i++;
}

测试循环条件变量时i的值是什么?

输入的第一个rollvalue读入数组中的某个位置,但是i递增,因此,如果从RollValues [i]读回,则从内存中的另一个位置!不仅如此,您永远不会在接受第二卷之前先看第一卷。然后再次增加i。到您回到循环顶部时,i已经前进了3次,并且没有对输入的卷进行过测试。

您还有其他问题,例如

  • 接收数组没有关联的“大小”信息,因此您现在不必知道调用方提供的数组大小。因此,您的代码无法防止内存溢出。

  • 在while循环中,每次迭代前进3次,因此,即使您的循环条件检查了边界情况,您仍然可能走回了数组 before 的末尾到循环顶部。

因此,我建议以下内容:

1)将数组的大小传递到函数中,或使用更安全的数据结构,例如std :: array或std :: vector

2)每个循环只处理一次掷骰,并在前进之前检查自己是否在界限之内。

3)在查看完索引所指向的位置的值之前,不要提高索引变量的大小。