虽然循环不会像C中那样破坏

时间:2012-10-23 22:30:51

标签: c loops while-loop

我试图学习如何使用C语言进行编程,并且偶然发现了一个似乎应该是一个简单修复的问题,但是它给了我更多问题然后我预料到了。我试图创建一个数字猜谜游戏,你有三次机会猜测数字,但我的问题是,当猜对了正确的答案时,Do While循环不会中断。这是功能:

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;

    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                printf("winner\n");
            }
        }
    } while(user_entry==lucky[i]||j<3);

}

基本上它应该遍历数组lucky [i]并检查user_entry是否等于数组中的20个数字中的任何一个。截至目前,它循环通过,识别是否从阵列中选择了中奖号码,但是没有从阵列中断。

当我将其更改为

}while(user_entry!=lucky[i]||j<3);  

它完全忽略了计数器,只是永远循环。

我不想使用休息,因为我所读过的所有内容都谈到了糟糕的编程习惯。还有另一种方法可以打破,或者只是犯了一个导致这个问题的错误。

提前致谢。

4 个答案:

答案 0 :(得分:3)

考虑你的索引变量“i”来自的第二个。找到正确的用户条目后会发生什么?控制流程在哪里?

我建议看一下“break”关键字。

答案 1 :(得分:2)

您撰写的while (user_entry == lucky[i]..)转换为as long as user_entry is equal to lucky[i] keep on looping。这显然不是你打算做的。

将您的条件转换为} while (user_entry != lucky[i] && j < 3);,您应该没问题。这将用简单的英语翻译成as long as user_entry is different of lucky[i] AND j is inferior to 3, keep looping

但是使用它,你测试lucky[i]的值,即使i没有任何意义(当我等于max时,你不想测试它,这就在域中undefined behavior)。

但如果您真的不想使用break关键字,一种解决方案是使用标志。在开始循环之前将其设置为1,并在找到正确答案时将其更改为0。您的代码将成为

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;
    char flag = 1;

    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                printf("winner\n");
                flag = 0;
            }
        }
    } while(flag&&j<3);

}

答案 2 :(得分:0)

}while(user_entry!=lucky[i]||j<3);

这是错误的逻辑 - 循环而用户的条目不是幸运数字或者j是否低于3?当然你真的想要这个:

}while(user_entry!=lucky[i]&&j<3);

这只是你第二个问题的解决方案,忽略了这个问题 - 主要问题在其他答案中得到了解决。

答案 3 :(得分:0)

唯一独立的条件是用户还有更多的猜测。试试这个“

while(j <= 3);

不应该是显而易见的,但是equals属于那里因为你在循环之前递增你的j所以它将是

j = 1 =&gt;第一次猜测

j = 2 =&gt;第二次猜测

j = 3 =&gt;第三个猜测

之后,用户应该没有更多的猜测

你应该发现这不起作用,因为我们想要在用户猜对时退出循环。要做到这一点,你可以使用int作为bool(0-false,1-yes)。

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;
    int exitCase = 0;
    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                exitCase = 1;
                printf("winner\n");
            }
        }
    } while(exitCase == 0 || j <= 3);

}
相关问题