2012-06-03 100 views
0

我剛剛對開關case有個疑問。 我可以這樣做嗎?我無法讓它工作。當我輸入退出時,程序只會說3次無效。 原諒僞代碼。 哎呀,我忘了提到printf函數看起來像這個部分之前。C:在開關語句中退出case

char choice; 
printf("list, add, delete, write, quit\n"); 

do 
{ 
scanf("%c", &choice); 
//if (&choice== "quit"){exit(1);} 

switch(choice) 
    { 
     case "list": 
     case "add": 
     case "delete": 
     case "write": 
     default: 
      printf("Invalid\n"); 
      break; 
     case "quit": 
     exit (1); 

    }while(&choice !="quit"); 

}

+3

這是無效的C,甚至不應該編譯。數組和指針都不是有效的案例標籤。 –

+0

@R ..所以,程序的輸出是非常正確的,不是嗎? –

+0

@panda當然。這不是編譯器或其他東西中的錯誤。 –

回答

4

你不能比較喜歡的字符串。字符串比較應該使用strcmp及其親屬。在這種情況下,您正在比較字符串的地址。

+0

但我仍然可以使用,如果其他語句正確嗎? – user1428720

+0

這個答案是錯誤的(只有第三個=最後一個句子)。 @ user1428720 - 如果你把它改成if else,那麼它開始是正確的 - 你會比較指針而不是字符串內容,如果有任何輸入字符串來自數據而不是字符串文字,你可能會錯過所有匹配編制單位。 –

1

此外,由於您不使用break而不是default的情況,因此您會自動「拖放」到默認情況(即使您的輸入choice與「list」,「add」,「delete」和「寫」)

+0

我之前忘了提及printf函數。抱歉 – user1428720

0

要回答你的問題:

是的,你可以叫exit()任何地方,包括一個開關case語句裏面。

但該代碼有很多問題,請參閱我對問題本身的評論。

2

雖然不能直接比較字符串你想要的方式,有一種方法可以使用字典和定義/枚舉搞一個開關(見我做什麼有):

enum choices { LIST, ADD, DELETE, WRITE, QUIT, INVALID }; 

int 
getchoice(char *input) 
{ 
    static struct choices { 
     enum choices val; 
     const char *string; 
    } choices [] = { 
     { LIST, "list" }, 
     { ADD, "add" }, 
     { DELETE, "delete" }, 
     { WRITE, "write" }, 
     { QUIT, "quit" }, 
     { -1, NULL } 
    }; 
    int i; 

    for (i = 0; choices[i].val != -1; i++) 
     if (strcmp(input, choices[i].string) == 0) 
      break; 
    if (choices[i].val == -1) 
     return INVALID; 
    return (choices[i].val); 
} 

,然後您的switch語句:

switch (getchoice(choice)) { 
case LIST: 
case ADD: 
case WRITE: 
case DELETE: 
case INVALID: 
default: 
    printf("Invalid\n"); 
    break; 
case QUIT: 
    exit(1); 
} 

買者自負,因爲這還沒有通過編譯器運行,但總體思路應該是足夠清楚,以適應您的具體情況(S)。