在C中退出while循环而不中断

时间:2017-12-01 15:31:03

标签: c while-loop

我有以下代码:

void takeOrder(void)
{
int stop = 0;
while(stop != 1)
{
    printf("What is your order?\n");
    printf("%c - fruitShake\n%c - milkShake\n", FRUIT_SHAKE_CHOICE, MILK_SHAKE_CHOICE); 
    scanf("%c", &typeChoice); 
    if(typeChoice != FRUIT_SHAKE_CHOICE || typeChoice != MILK_SHAKE_CHOICE)
    {
        printf("***Error! Wrong type***");
        stop = 1;
    }
    //more code below
}

}

我尝试使用标记"停止"来尝试退出while循环,但它不起作用,它只是继续下面的其余代码。 有没有办法退出这个带循环的while循环而不使用break?

4 个答案:

答案 0 :(得分:7)

你可以通过多种方式实现这一切,所有这些都远远低于使用break

  • 您可以添加else并增加// more code部分的代码嵌套,或
  • 您可以设置变量并使用continue代替break来混淆您的读者,或者
  • 您可以添加标签并使用goto来激怒您的同事

最好的方法是使用break,然后完全放弃stop变量,将其替换为" forever"循环:

for (;;) {
    ...
    if (condition) {
        break;
    }
    ...
}

这个结构是惯用的,当三个内置循环都没有给你一个特别好的拟合时,即当在循环的中间做出决定中断或继续,而不是循环的顶部(如forwhile循环中)或循环的底部(如do / while循环中所示)。

注意:设置变量时代码没有结束循环的原因是不会连续检查循环条件。而是在每次迭代开始之前检查一次。之后,条件可能会在循环体内的任何位置变为无效。

答案 1 :(得分:5)

我看到的唯一方式是条件more code below部分

 int stop = 0;

 while (stop != 1) {
   if (typeChoice == FRUIT_SHAKE_CHOICE || typeChoice == MILK_SHAKE_CHOICE) {
     stop = 1;
   } else {
     // more code below
   }
 }

使用函数的第二种唯一方式

while (doStuff() == 0);

int doStuff(void) {
   if (typeChoice == FRUIT_SHAKE_CHOICE || typeChoice == MILK_SHAKE_CHOICE) {
     return 1;
   } 

   // more code below

   return 0;
}

PS :也许我是 nazi ,但这绝对应该是do ... while

 int stop = 0;

 do {
   if (typeChoice == FRUIT_SHAKE_CHOICE || typeChoice == MILK_SHAKE_CHOICE) {
     stop = 1;
   } else {
     // more code below
   }
 } while (stop != 1);

答案 2 :(得分:2)

首先替换

if(typeChoice != FRUIT_SHAKE_CHOICE || typeChoice != MILK_SHAKE_CHOICE)

if(typeChoice != FRUIT_SHAKE_CHOICE && typeChoice != MILK_SHAKE_CHOICE)
                                   ^^^^

否则if永远不会成立 - 基于上面提供的选择,这就是你想要做的事情。

然后确保"更多代码"在这种情况下不执行

if(typeChoice != FRUIT_SHAKE_CHOICE && typeChoice != MILK_SHAKE_CHOICE) {
   printf("Wrong type\n");
   stop = 1;
}
else {
    // more stuff
}

在您当前的代码中,即使stop设置为1,您也可以执行"更多内容"。

您也可以测试相反的情况,并将continue添加到OK代码中,否则设置为stop

if(typeChoice == FRUIT_SHAKE_CHOICE || typeChoice == MILK_SHAKE_CHOICE) {
    // do more stuff
    continue; // keep going
}
printf("Wrong choice, same player shoot again\n");
stop = 1;

答案 3 :(得分:0)

我希望FRUIT_SHAKE_CHOICE是宏(字符值)

另一件事是因为scanf("%c", &typeChoice);缓冲区在第二次输入之前没有得到清除

使用(提供空格)或使用getchar() / fgetc()

scanf(" %c", &typeChoice);

这是我的理解

#define FRUIT_SHAKE_CHOICE 'a'
#define MILK_SHAKE_CHOICE 'b'
void takeOrder(void)
{
char typeChoice;
int stop = 0;
while(stop != 1)
{
    printf("What is your order?\n");
    printf("%c - fruitShake\n%c - milkShake\n", FRUIT_SHAKE_CHOICE, MILK_SHAKE_CHOICE); 
    scanf(" %c", &typeChoice); 
    if(typeChoice != FRUIT_SHAKE_CHOICE && typeChoice != MILK_SHAKE_CHOICE)
    {
        printf("***Error! Wrong type***");
        stop = 1;
        continue;// bcz once stop becomes 1 , you don't to want to execute below part, it will jump to while condition checking part & come out from loop
    }
    //more code below
}
}
int main()
{
     takeOrder();
     return 0;
}