在C,而循环中switch语句(Switch statement within while loop

2019-08-31 14:44发布

有关于内开关语句多个岗位,while循环,除了一个事实,即他们都不是用C语言从我所看到的完成,至少。 C ++可以创建布尔表达式,这我是知道的,但不是在C.我有一个while循环,它包含一个开关控制。 然而,当我写我的交换机中的break语句,它会回到循环的开始,让我的程序运行下去。 忽略我使用的,因为他们肯定工作的功能。 我只需要对我的处理嵌套的一些澄清。 谢谢!

Here is my main.c:

while(1)
{
    printf("0) Exit\n1) List Tasks\n2) Add Task\n");                                            
    printf("3)Delete Task\n4) Add Task From File\n");                                           
    printf("What would you like to do?\n");
    fgets(buf1, 50, stdin);                                                                     
    p = atoi(buf1);
    switch(p)
    {
          case 0: 
            break;
          case 1: 
            printTaskList(pTaskList);
            break;
          case 2:
            printf("Enter task name: ");
            fgets(buf2,100,stdin);
            printf("Enter task priority: ");
            fgets(buf3,100,stdin);
            printf("Enter task start date: ");
            fgets(buf4,50,stdin);
            pTask = makeTask(buf2,buf4,buf3);
            addTaskToEnd(pTaskList,pTask);
            break;
          case 3:
            printTaskList(pTaskList);
            printf("What task would you like to delete? ");
            fgets(buf6,50,stdin);
            taskNum = atoi(buf6);
            removeTask(pTaskList,taskNum);
            break;
          case 4:
            printf("Enter the filename ");
            fgets(buf7,50,stdin);
            break;
          default:
            printf("ERROR: %d: Incorrect menu option\n", p);
     }
}

Answer 1:

break; 将退出最近的封闭的出switch或循环。 跳两级,你将不得不使用可怕的goto ,或者重新组织这样一个return将完成所需的语义。

while(1) {
    switch(x) {
    case 0: goto EndWhile;
    }
}
EndWhile: ;

要么

void loop() {
    while(1) {
        switch(x) {
        case 0: return;
        }
    }
}
//...
loop();
//...

你完全可以使用C中的布尔表达式只需使用一个int

int quit = 0;
while(!quit) {
    switch(x) {
    case 0: quit = 1; break;
    }
}

C也有一个布尔数据类型,如果你真的想要它。

#include <stdbool.h>

bool quit = false;
while(!quit) {
    switch(x) {
    case 0: quit = true; break;
    }
}

而多一个选择,对于完全疯了。

#include <setjmp.h>

jmp_buf jbuf;
if (!setjmp(jbuf))
    while(1) {
        switch(x) {
        case 0: longjmp(jbuf, 1);
        }
    }


Answer 2:

C ++可以在C.创建布尔表达式,这我是知道的,但不

哦? 那么,什么是0 == 0 ,如果没有一个布尔表达式? 如果你指的是类型的变量bool ,请确保您#include <stdbool.h>

然而,当我写我的交换机中的break语句,它会回到循环的开始,让我的程序运行下去。 忽略我使用的,因为他们肯定工作的功能。 我只需要对我的处理嵌套的一些澄清。 谢谢!

不是,它不会回到循环的开始。 执行继续从switch语句的端部(后立即switch ES闭合支架, } )。 在你的情况,这是功能上等同于要回循环的开头

有几个可供您选择。 别人都在用一个单一变量来控制你的循环提示。 这将是一个好主意,但他们使用新的变数,这表明尽管该变量已经存在于你的逻辑。 如果你想解决您的问题这种方式,可以考虑:

do {
    /* ... */
} while (p != 0);

另外, return从主,当你想退出,或拨打exit(0); 其他功能。 如果你想运行额外的清理/输出码这是不是所有的帮助。

在这种情况下, switch控制结构是不是真的比任何一个更好的链条if / else if / else分支机构。 如果你使用的if / else if / else分支,你可以break; 圈外的更容易。 我会使用一个switch控制结构时,我想执行流经到其他案件。

作为另一种选择,你可以使用goto表达跳出循环到标签的主要之外。 当有来自循环多个可能的退出点,如搬运和清理以下分配错误,这将是最好的。



Answer 3:

您可以在C具有布尔表达式太多。 从1999年C标准具有stdbool.h报头和一个数据类型布尔 。 (!)在旧Ç方言,比如一个在Visual Studio 2012,也没有布尔数据类型,所以你需要使用纯整数代替:

int keep_looping = 1;
while (keep_looping) {
    ....
    if (....)
        keep_looping = 0;
}


Answer 4:

你永远不会退出循环。 该突破将刚刚突破交换机。 此时应更换

while(1)

与别的,意味着while循环应该退出



Answer 5:

你休息只剩switch语句,然后在继续上

while(1)

永远循环下去。



Answer 6:

使用出口(0);
无论你想退出。

In this partcular case you have to put the condition in the while loop parameter

其他的方法来从while循环出来的可能是使用: return语句。 但是,这也将退出当前功能。

适当的解决办法可能是使用goto label; 在交换机内部,然后用label: statement; while循环之外。

例如:

while(1){
  switch(x){

   case 0:goto label;

   default:break;
   }
}
label:
printf("out of while loop");


文章来源: Switch statement within while loop in C