2017-06-03 42 views
-2
while(1) { 
    printf("1. ADD\n2. VIEW LIST\n3. QUIT\n"); 
    int menu = 0 ; 
    menu = getchar()-48; 
    getchar(); 
    switch(menu) { 
     case 1: 
      addition(book,count++); break; 
     case 2: 
      viewList(book); break; 
     case 3: 
      return 0; 
    } 
} 

我只是試着做我的練習代碼。但是,我對這個C代碼有個疑問。爲什麼我應該在C代碼中使用這樣的getchar()?

我覺得

getchar(); 
menu = (getchar()-48); 

是正確的。但是,我是這樣寫的。我的代碼不能正常工作。並重復打印出三個菜單。你能解釋一下嗎?我知道的是getchar可以獲得字符類型所以,我應該從getchar值(在ASCII代碼表之後)抽象48。

我只想知道爲什麼它不能正常工作。

getchar(); 
menu = (getchar()-48); 
+0

我想通過使用getchar()獲取值後;並設置值菜單=(getchar() - 48); 。 – Codingdumb

+0

我錯了嗎?..... – Codingdumb

+0

像getchar() - 48'這樣的東西總是**錯了! getchar是什麼返回EOF?如果角色小於48,該怎麼辦?如果您的平臺不使用ASCII編碼會怎麼樣?你甚至讀過'getchar'的文檔嗎? – Olaf

回答

0

你想要的代碼是

int menu = getchar(); 
int ch; 
/* horrid looking, but "eat" the rest of the line user input */ 
while((ch = getchar()) != '\n') 
    continue; 

switch(menu) 
{ 
    case '1': 
    /* handle menu item 1 */ 
    break; 
    case '2': 
     /* handle menu item 2 */ 
     break; 
    default: 
     /* unsupported menu entry, handle it */ 
} 

無需減去48獲得菜單進入範圍0到9 單引號字符常量。所以編譯器將用49替換'1' (假設爲Ascii)。它更具可讀性,更便於攜帶。

+1

您需要爲'EOF'測試'ch',可以通過鍵盤發送信號,或者在發生錯誤時從'getchar()'返回。因爲,你會有一個無限循環。 –

2

當你使用你的程序,按下選擇鍵,,或,其次是輸入。這會將兩個字符放入輸入緩衝區。

getchar的第一個呼叫將刪除數字字符。你減去48,這是你係統上'0'的代碼;在其他系統上它可能無法工作。這樣做的一個可移植的方法將讓編譯器使用適當的數字代碼'0'

menu = getchar()-'0'; 

第二getchar調用有從輸入緩衝區中移除'\n'。如果您將兩個電話轉接,則第一個getchar將刪除該數字,而第二個getchar將讀取'\n'

+1

是否存在seconde getchar()來拋棄'\ n'(輸入)值? – Codingdumb

相關問題