繁体   English   中英

While循环不会按C的预期中断

[英]While loop won't break as intended in C

我正在尝试学习如何使用C编程,并且偶然发现了一个似乎应该是简单的解决方案的问题,但是它给了我比我预期的更多的问题。 我正在尝试创建一个数字猜谜游戏,您有3次机会猜数字,但是我的问题是,当猜对了正确答案时,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);  

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

我不想使用break,因为我所读到的所有内容都谈到了不良的编程实践。 还有另一种方法可以打破,或者只是犯了一个错误而导致了此问题。

提前致谢。

考虑一下索引变量“ i”的来源。 找到正确的用户条目后会发生什么? 控制流向何处去?

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

您写了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这将以普通英语翻译。

但是使用它,即使i没有任何意义,您也可以测试lucky[i]的值(当i等于max时,您不想对其进行测试,这属于未定义行为的领域)。

但是,如果您确实不想使用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);

}

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

这是不好的逻辑-在用户输入的不是幸运数字或j小于3时循环播放? 当然您确实想要这样:

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

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

唯一独立的条件是用户还有更多的猜测。 尝试一下

while(j <= 3);

小于应该是显而易见的,但是等值属于那里,因为您在循环之前增加了j,所以它将

j = 1 =>第一个猜测

j = 2 =>第二个猜测

j = 3 =>第三次猜测

之后,用户将不再有任何猜测

您应该发现这是行不通的,这是因为如果用户猜对了,我们想退出循环。 为此,您可以将int用作布尔值(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);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM