Do...while 循环意外行为
Do... while loop unexpected behavior
快速说明:
我想给单词分配随机数,这样每个字母都有不同的数字。为了方便起见,我使用了数组而不是单独的一个字母变量;这样我就知道 "abc[1]" 是单词 "abc" 中的字母 'b'。单词的第一个数字使用不同的范围以避免出现像“075”
这样的数字
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int abc[2];
int def[2];
void setRandom()
{
abc[0] = rand() %9+1;
do {abc[1] = rand() %10;} while (abc[1] == abc[0]);
do {abc[2] = rand() %10;} while (abc[2] == abc[1] || abc[2] == abc[0]);
printf("RANDOM abc %d %d %d", abc[0], abc[1], abc[2]); //printed just fine.
do {def[0] = rand() % 9 +1; } while (def[0] == abc[2] || def[0] == abc[1] || def[0] == abc[0]); //code seems to be stuck here
do {def[1] = rand() %10;} while (def[1] == def[0] || def[1] == abc[2] || def[1] == abc[1] || def[1] == abc[0]);
do {def[2] = rand() %10;} while (def[2] == def[1] || def[2] == def[0] || def[2] == abc[2] || def[2] == abc[1] || def[2] == abc[0]);
printf("RANDOM def %d %d %d", def[0], def[1], def[2]); //THIS CODE IS NEVER REACHED. WHY?
}
int main ()
{
setRandom();
printf("RANDOM SET");
}
我知道这些数字并不是真正随机的。我知道代码很乱。我知道暴力破解数字是无效的。我知道这种设置数字的方式很糟糕,但我想不出更好的方法。此代码将完成我的工作。
问题是上面的代码在为 def[0] 生成数字时卡住了;它会无限生成新的随机数,它似乎完全忽略了循环的 'while' 部分。
你可以建议一个更好的方法来做我正在尝试做的事情,或者只是一个问题的解决方案,两者都可以,因为项目并不大,它只是用作解谜器.
问题是您为数组选择了错误的大小。 def[0]
和 abc[2]
很可能指向同一个位置。
具体来说,您正在创建大小为 2 的数组,然后访问其中的 3 个元素。变化:
int abc[2];
int def[2];
至:
int abc[3];
int def[3];
另请参阅 this answer 了解更好的方法来完成您想要做的事情。
C/C++ 中的数组是从零开始的。创建 abc[2]
只给你 0 和 1 来合法访问。超出数组末尾的任何内容都是未定义的行为 - 在这种情况下,abc[2]
(third,而不是第二个元素)很可能指向 def[0]
.
修正您的代码,使两个声明都分配 3 个元素而不是 2 个。
快速说明: 我想给单词分配随机数,这样每个字母都有不同的数字。为了方便起见,我使用了数组而不是单独的一个字母变量;这样我就知道 "abc[1]" 是单词 "abc" 中的字母 'b'。单词的第一个数字使用不同的范围以避免出现像“075”
这样的数字#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int abc[2];
int def[2];
void setRandom()
{
abc[0] = rand() %9+1;
do {abc[1] = rand() %10;} while (abc[1] == abc[0]);
do {abc[2] = rand() %10;} while (abc[2] == abc[1] || abc[2] == abc[0]);
printf("RANDOM abc %d %d %d", abc[0], abc[1], abc[2]); //printed just fine.
do {def[0] = rand() % 9 +1; } while (def[0] == abc[2] || def[0] == abc[1] || def[0] == abc[0]); //code seems to be stuck here
do {def[1] = rand() %10;} while (def[1] == def[0] || def[1] == abc[2] || def[1] == abc[1] || def[1] == abc[0]);
do {def[2] = rand() %10;} while (def[2] == def[1] || def[2] == def[0] || def[2] == abc[2] || def[2] == abc[1] || def[2] == abc[0]);
printf("RANDOM def %d %d %d", def[0], def[1], def[2]); //THIS CODE IS NEVER REACHED. WHY?
}
int main ()
{
setRandom();
printf("RANDOM SET");
}
我知道这些数字并不是真正随机的。我知道代码很乱。我知道暴力破解数字是无效的。我知道这种设置数字的方式很糟糕,但我想不出更好的方法。此代码将完成我的工作。
问题是上面的代码在为 def[0] 生成数字时卡住了;它会无限生成新的随机数,它似乎完全忽略了循环的 'while' 部分。
你可以建议一个更好的方法来做我正在尝试做的事情,或者只是一个问题的解决方案,两者都可以,因为项目并不大,它只是用作解谜器.
问题是您为数组选择了错误的大小。 def[0]
和 abc[2]
很可能指向同一个位置。
具体来说,您正在创建大小为 2 的数组,然后访问其中的 3 个元素。变化:
int abc[2];
int def[2];
至:
int abc[3];
int def[3];
另请参阅 this answer 了解更好的方法来完成您想要做的事情。
C/C++ 中的数组是从零开始的。创建 abc[2]
只给你 0 和 1 来合法访问。超出数组末尾的任何内容都是未定义的行为 - 在这种情况下,abc[2]
(third,而不是第二个元素)很可能指向 def[0]
.
修正您的代码,使两个声明都分配 3 个元素而不是 2 个。