2013-03-05 18 views
2

我試圖讓防禦性編程的輸入爲整數,但如果我輸入字符,程序將進入無限循環。 然後,我切換到有輸入作爲一個字符,但它做了兩次循環。一次用於錯誤的字符,一次用於行尾擊鍵。菜單上的防禦性編程。我應該輸入什麼類型的輸入?

有什麼辦法可以得到循環,只有一次?

代碼:

int main(int argc, char *argv[]) 
{ 
    char choice='5'; 
    while (choice != '1' && choice !='2' && choice !='3' && choice!='4' && choice!='0') 
     { 
      printf("Parakalw epilekste ena apo ta parakatw\n\n"); 
      printf("1.\tKafe 1.5 euro\n"); 
      printf("2.\tKafe me gala 1.8 euro\n"); 
      printf("3.\tSokolata 2.1euro\n"); 
      printf("4.\tSokolata me gala 2.4 euro\n"); 
      printf("0.\tExodos\n\n"); 
      printf("parakalw eisagete thn epilogh sas: "); 
      scanf("%c",&choice); 
     } 
system("PAUSE");  
return 0; 
} 
+0

爲什麼不能像int n; ?scanf函數(「%d」,&n);' – Mikhail 2013-03-05 19:31:01

+0

它進入一個無限循環當n =任意字符,而不是一個數量 – n17n 2013-03-05 19:34:24

+0

@NikolaosTsouktakos:那是因爲scanf函數將無法讀取一個號碼,你的循環寫入的方式會不斷嘗試,使用相同的輸入,直到永遠。 – teppic 2013-03-05 19:44:38

回答

2

使用scanf(" %c", &choice),使其跳過空格,否則你換行留在採摘標準輸入的字符後,它會在未來scanf函數調用來讀。指定符之前的空格表示它將匹配任何類型的空白字符(空格,製表符和返回值)。

+0

是一種「防禦性編程」重要嗎?我應該再看看它還是待着? – n17n 2013-03-05 19:28:08

+0

它總是好的,以檢查用戶輸入一個有效的價值。一個常見的方法是使用帶有switch語句的循環來處理輸入,並使用默認情況下輸出錯誤消息。 – teppic 2013-03-05 19:29:20

2

對於防禦式編程(你正好意味着什麼都),我不會用scanf的話,那是很容易犯錯誤吧。

取而代之,讀取輸入行fgets,然後根據需要解析,然後使用修剪,自定義解析代碼或可能在驗證後進行驗證。

而且,你的任何*scanf功能的更好的檢查返回值,總是如此。檢查實際錯誤和實際掃描的項目數。

相關問題