2017-02-10 76 views
0

如果輸入的數字不是1或2,那麼它會輸入正確的輸入(默認值)。如果ipnut是一個類似「a」的字母而不是開始垃圾郵件的默認情況。如果輸入是字母,則輸出默認無限次

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int v, kapcs = 0; 
    printf("Szerinted Szaki Trisztan egy kocsog?\n1 Igen\n2 Nem\n"); 

    do 
    { 
     kapcs = 0; 

     scanf("%d", &v); 

     switch (v) 
     { 
      case 1: 
       printf("Igen, o egy kocsog!"); 
       break; 
      case 2: 
       printf("Helytelen... O egy kocsog!"); 
       break; 
      default: 
       printf("NEM VALASZLEHETOSEG, VALASSZ: 1 VAGY 2\n"); 
       kapcs = 1; 
       break; 
     } 

    } 
    while (kapcs == 1); 

    return 0; 
} 
+0

所以...預計什麼? –

+0

[爲什麼scanf()在此代碼中導致無限循環?](http://stackoverflow.com/questions/1716013/why-is-scanf-causing-infinite-loop-in-this-code) – Brick

回答

0

當你輸入的東西,不會在scanf函數所需格式相匹配()該值保留在輸入緩衝區中。所以你可以做的是在默認情況下添加一個getchar()。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int v, kapcs = 0; 
    printf("Szerinted Szaki Trisztan egy kocsog?\n1 Igen\n2 Nem\n"); 

    do 
    { 
    kapcs = 0; 

    scanf("%d", &v); 

    switch (v) 
    { 
     case 1: 
      printf("Igen, o egy kocsog!"); 
      break; 
     case 2: 
      printf("Helytelen... O egy kocsog!"); 
      break; 
     default: 
      printf("NEM VALASZLEHETOSEG, VALASSZ: 1 VAGY 2\n"); 
      kapcs = 1; 
      getchar(); 
      break; 
    } 

}while(kapcs == 1); 

return 0; 
} 

還能夠支持我的觀點,你可以做到以下幾點: 的#include 的#include

int main() 
{ 
    int v, kapcs = 0; 
    printf("Szerinted Szaki Trisztan egy kocsog?\n1 Igen\n2 Nem\n"); 

    do 
    { 
    kapcs = 0; 

    scanf("%d", &v); 

    switch (v) 
    { 
     case 1: 
      printf("Igen, o egy kocsog!"); 
      break; 
     case 2: 
      printf("Helytelen... O egy kocsog!"); 
      break; 
     default: 
      printf("NEM VALASZLEHETOSEG, VALASSZ: 1 VAGY 2\n"); 
      kapcs = 1; 
      printf("%c",getchar()); 
      break; 
    } 

}while(kapcs == 1); 

return 0; 
} 

通過添加這種小的printf(),你會發現的getchar似乎不等待爲輸入。相反,它只是輸出剛纔在輸入流中提供的那個字符。

P.S. :請注意,這個答案只是爲了澄清那個無與倫比的輸入部分。如果輸入與您的案例不符的號碼,您需要小心。在這種情況下,簡單地檢查scanf()的轉換成功與否,採取的是一個數如下:

count=scanf("%d",&v); 

,然後在默認情況下,檢查爲:

if(count==0){ 
getchar(); 
} 
+0

注意,如果'scanf()'彈出一個不是1或2的十進制字符,'getchar()'可能無限期地被阻塞。 – sturcotte06

0

scanf%d讀取十進制數字。不是數字的'a'會留在下一個循環的輸入流中 - 永遠。如果您想要使用'a',則必須將一行代碼添加到默認情況下才能使用它。

但是,您如何區分「a」和「3」?答案是scanf返回轉換的參數數量。因此,對於「一」,scanf函數將返回0,併爲「3」,scanf函數將返回1

int main() 
{ 
    int v, kapcs = 0; 
    printf("Szerinted Szaki Trisztan egy kocsog?\n1 Igen\n2 Nem\n"); 

    do 
    { 
     kapcs = 0; 

     int cnt = scanf("%d", &v); 

     switch (v) 
     { 
      case 1: 
       printf("Igen, o egy kocsog!"); 
       break; 
      case 2: 
       printf("Helytelen... O egy kocsog!"); 
       break; 
      default: 
       printf("NEM VALASZLEHETOSEG, VALASSZ: 1 VAGY 2\n"); 
       kapcs = 1; 
       if (cnt == 0)  /* if input was not a number */ 
        getchar(); /* skip a character of input */ 
       break; 
     } 

    } 
    while (kapcs == 1); 

    return 0; 
}