做... while循环意外行为

时间:2016-07-03 14:52:41

标签: c++ do-while

快速解释: 我希望将随机数分配给单词,以便每个字母都有不同的数字。为方便起见,我使用了数组而不是单独的一个字母变量;这样我知道" abc [1]"是字母' b'来自word" abc"。单词的第一个数字使用不同的范围以避免使用" 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]的数字时卡住了;它会无限地生成新的随机数,它似乎完全忽略了“#”;而#39;循环的一部分。

你可能会建议一个更好的方法来做我想要做的事情,或者只是解决问题的方法,要么会做得很好,因为项目不是很大,它是&#39; s只是用作拼图解算器。

2 个答案:

答案 0 :(得分:2)

问题是您为阵列选择了错误的大小。 def[0]abc[2]很可能指向同一位置。

具体来说,您要创建大小为2的数组,然后访问它们的3个元素。变化:

int abc[2];
int def[2];

为:

int abc[3];
int def[3];

另请参阅this answer,了解更好的方法来做您想做的事情。

答案 1 :(得分:1)

C / C ++中的数组是从零开始的。创建int只允许0和1合法访问。超出数组末尾的任何内容都是未定义的行为 - 在这种情况下,abc[2]第三个​​,而非第二个元素)可能指向abc[2]

修复代码,使两个声明分配3个元素而不是2个。