当满足条件时,While循环未结束

While loop not ending when condition is met

本文关键字:While 循环 未结束 满足 条件      更新时间:2023-10-16
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循环来处理数组,但我很难确定如何执行此操作。

我从函数中删除了不属于问题的行,但这可能会澄清:

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

测试循环条件变量时,i的值是多少?

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

你也有其他问题,比如

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

  • 在while循环中,每次迭代前进3次,因此即使循环条件检查边界情况,您仍然可以在返回循环顶部之前离开数组的末尾

因此,我建议如下:

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

2( 每个循环只处理一次滚动,并在前进前检查您是否在边界内。

3( 在查看完索引变量所引用位置的值之前,不要推进索引变量。