我有以下代码:
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?
答案 0 :(得分:7)
你可以通过多种方式实现这一切,所有这些都远远低于使用break
:
else
并增加// more code
部分的代码嵌套,或continue
代替break
来混淆您的读者,或者goto
来激怒您的同事最好的方法是使用break
,然后完全放弃stop
变量,将其替换为" forever"循环:
for (;;) {
...
if (condition) {
break;
}
...
}
这个结构是惯用的,当三个内置循环都没有给你一个特别好的拟合时,即当在循环的中间做出决定中断或继续,而不是循环的顶部(如for
和while
循环中)或循环的底部(如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;
}