2017-02-10 15 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

あなたが入力何かを返します)、その値は入力バッファーにとどまります。だからあなたができることは、デフォルトの場合に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; 
} 

また、あなたは、次の操作を行うことができ、私の引数をサポートするために、この少しのprintfを追加することにより の#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; 
} 

を()あなたはGETCHARが待機するようには思えないことがわかります入力のために。代わりに、単に入力ストリームで提供した文字を出力します。

P.S. :この回答は、その不一致の入力部分を明確にするために作成されたものです。あなたのケースに合わない番号を入力する場合は注意が必要です。

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

してから、デフォルトの場合のチェック::scanf関数()変換が成功したかどうか、次のようにカウントを取ることであれば、その場合には、単にチェックしそう

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

'getf()'が1または2でない小数点をポップした場合、getchar()が無期限にブロックされる可能性があるので注意してください。 – sturcotte06

0

scanf%dは小数点以下を読み取ります。 'a'は数字ではなく、次のループの入力ストリームに永久に残されます。 'a'が消費されるようにするには、消費するためにコードの行をデフォルトのケースに追加する必要があります。

しかし、「a」と「3」を区別するにはどうすればよいですか?答えは、scanfは変換された引数の数を返します。だから、「A」のために、scanf関数は0を返し、「3」のために、scanf関数は(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; 
} 
関連する問題