簡體   English   中英

在C中while循環中切換語句

[英]Switch statement within while loop in C

在while循環中有幾個關於switch語句的帖子,除了它們都沒有在C語言中完成的事實,至少從我看到的情況來看。 C ++可以創建布爾表達式,我知道,但不是在C中。我有一個包含開關控件的while循環。 但是,當我在switch中編寫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);
     }
}

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);
        }
    }

您也可以在C中使用布爾表達式。 1999年的C標准有一個stdbool.h頭和一個數據類型bool 在較舊的C方言中,例如Visual Studio 2012(!)中的方言,沒有布爾數據類型,因此您需要使用簡單的int:

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

C ++可以創建我知道的布爾表達式,但不能用C語言創建。

哦? 那么什么是0 == 0 ,如果不是布爾表達式? 如果你指的是bool類型的變量,請確保#include <stdbool.h>

但是,當我在switch中編寫break語句時,它會回到循環的開頭並使我的程序永遠運行。 忽略我使用的功能,因為它們確實有用。 我只需要澄清一下我對嵌套的處理方法。 謝謝!

不。它不會回到循環的開頭。 執行從switch語句的結尾繼續執行(緊接在switch es closing brace之后, } )。 在您的情況下,這在功能上與返回循環的開頭相同。

有幾種選擇可供您使用。 其他人建議使用唯一變量來控制你的循環。 這是一個好主意,但他們建議使用變量,盡管變量已存在於您的邏輯中。 如果您想以這種方式解決問題,請考慮:

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

或者,當您想要退出時,從main return ,或者調用exit(0); 來自其他功能。 如果您想運行額外的清理/輸出代碼,這並不是很有用。

在這種情況下, switch控制結構實際上並不比if / else if / else分支鏈好。 如果你要使用if / else if / else分支,你就可以break; 更容易擺脫循環。 當我希望執行流入其他情況時,我會使用switch控制結構。

作為另一種選擇,您可以使用goto表達式將循環跳出到main之外的標簽。 當循環中有多個可能的退出點時,例如處理和清除分配錯誤后,這將是最好的。

你永遠不會退出循環。 休息將打破你的開關。 你應該更換

while(1)

用其他東西暗示應該退出while循環

你的休息只留下switch語句,然后繼續

while(1)

永遠循環。

使用exit(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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM