C中的无限循环难度

时间:2015-12-03 13:38:23

标签: c

我一直在尝试制作单词搜索游戏,在这部分代码中,我一直试图在随机位置输出4个随机单词,这样单词永远不会重叠。然而,这导致了无限循环,我无法理解为什么。你能帮我吗?

这是代码:

char getRandomCharacter();
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int main(void){

    int randomNum;
    int rand2;
    int rand3;
    char* wordSearch[10][10];
    const char *takenWords[4];
    const char *words[20]={"DOG", "CAT", "ELEPHANT", "CROCODILE", "HIPPOPOTAMUS", "TORTOISE", "TIGER", "FISH", "SEAGULL", "SEAL", "MONKEY", "KANGAROO", "ZEBRA", "GIRAFFE", "RABBIT", "HORSE", "PENGUIN", "BEAR", "SQUIRREL", "HAMSTER"};

    for(int i=0; i<10; i++){
        for(int j=0; j<10; j++){
            wordSearch[i][j]="1";
        }
    }


    srand(time(NULL));
    printf("\n\tA\t\tB\t\tC\t\tD\t\tE\t\tF\t\tG\t\tH\t\tI\t\tJ\n");

    for(int i=0; i<10; i++){
        printf("\n%d\t", i);

            while(i<4){
                do{

                rand2=(rand()%10);
                rand3=(rand()%10);
                if(strcmp(wordSearch[rand2][rand3],"1")==0){
                    int flag=0;
                    do{
                        randomNum = (rand()%20);
                        takenWords[i]=words[randomNum];
                        flag=0;
                        for(int j=0;j<i;j++){
                            if(strcmp(words[randomNum],takenWords[j])==0)flag=1;
                        }
                    }while(flag);
                    printf("%s\n", words[randomNum]);
                }

                }while(strcmp(wordSearch[rand2][rand3],"1")==0);
        printf("\n\n");
            }
    }

        getchar();
        return 0;
}

非常感谢!

4 个答案:

答案 0 :(得分:1)

你不在i++循环中while,因此执行将永远不会结束(因为语句i<4始终评估为{ {1}}。

答案 1 :(得分:1)

除了检查其他人指出的i循环中的for之外,此比较(以及while()中的进一步向下)

if(strcmp(wordSearch[rand2][rand3],"1")==0)

将始终评估为true,因为使用1-char字符串"1"初始化网格数组它们永远不会更改。这是无限循环的另一个原因。

也许这也是一样,因为网格字符串只有一个字符的空间,而且无论如何它们都是指向字符串文字的指针,你无法覆盖它们。但是,您可以使用

覆盖指针
 wordSearch[rand2][rand3] = words[randomNum];

答案 2 :(得分:0)

while(i<4){

您在for循环的第一次迭代中输入此处;那么,既然你永远不会在i循环中更改while的值,那么你将永远陷入困境。

答案 3 :(得分:0)

这是一个简单代码的伪示例。

想法是找到单词索引,然后将单词点添加到结果中。不需要比较字符串。这确实假设单词列表没有重复条目,如果首先进行重复数据删除。

Create a double character pointer array for the results
Create a integer array for taken word indexes
Loop for the number or results (10 in this case)
    set the taken word indexes to -1
    Loop for the numbers of words per set (4 in this case)
        Do
            Create a random word index (in this case 0-19)
            Check if the random word index is already in the taken word indexes
        Exit the loop when an unused index is found
    Add the new word index to the taken word array
    Add the new word pointer to the results

可以用12行代码编写。

外部循环中的代码应该是一个由外部循环调用的单独函数。

创建一个函数,以检查随机单词索引是否已经在所采用的单词索引中。该函数可以用10行代码编写,包括声明和返回。