2016-10-05 7 views
2

誤った入力がいくつか入力されている場合は、文を1回だけ印刷する方法: 例: kkkを入力すると、以下の例の代わりに1つの文が印刷されます。 サンプル出力:Cで1回だけ印刷する

はあなたが終了してQを継続するために(再びタイプYをしようとしますか:KKK

エラー:無効な選択肢

はあなたが終了してQを継続するために(再びタイプYをしようとしますか:エラー:

はあなたが終了してQを継続するために、再び(タイプYを試してみますか無効選択肢:エラー:

はあなたがもう一度試してみますか無効選択(タイプYは終了してQを継続します

'K'、 'K'、 'K'、および「\ nを:あなたの
valid=0; 
while (valid==0) 
{ 
    printf("\nDo you wish to try again (Type Y to continue Q to quit:"); 
    // print statement request for input 
    scanf(" %c", &choice); // get user input 
    choice = toupper(choice); 
    if((choice == 'Y') || (choice == 'Q')) 
     valid= 1; 
    else 
     printf("Error: Invalid choice\n"); // statement 
} 

答えて

3

は現在、単一の文字(%c)ので、あなたが入力し、 "KKK" と入力し、Enterキーを押したときに、それが受け取る入力のために4回を探しています'

代わりに%sを使用するように変更し、取得した文字列の最初の文字のみを確認してください。

コメントに記載されているように、fgetsを使用して文字列を取得し、前述のように処理します。

1

scanfフォーマット指定子 "%c"のため、コードが1時間あたり1文字のチェックを行っています。つまり、scanfが最初にEnterキーの後に終了し、次の呼び出しですぐにユーザーが入力したすべての文字を返します。

この現象を回避するには、一度にすべての入力を行うことができます。

あなたのような何かを行うことができます:あなたは私が一発で全入力(マルチ文字)を格納するために、バッファにユーザからの入力を取得するためのfgetsを使用見ることができるように

#include <stdio.h> 
#include <ctype.h> 

int main (void) 
{ 
    int valid=0; 
    char choice[32]; 
    size_t i=0; 
    int data; 

    while (valid==0) 
    { 
     printf("\nDo you wish to try again (Type Y to continue Q to quit):"); // print statement request for input 

     fgets(choice, sizeof(choice), stdin); 

     i=0; 

     while ((choice[i] != '\0') && (valid == 0)) 
     { 
      data = toupper((unsigned char)(choice[i])); 

      if((data == 'Y') || (data == 'Q')) 
      { 
       valid= 1; 
      } 

      i++; 
     } 

     if (valid == 0) 
      printf("Error: Invalid choice\n"); // statement 
    } 
} 

を。その後

あなたがループthroung入力文字をすることができ、それらの文字の一つが正しい選択である場合は、それを行うための

+2

'TOUPPER (choice [i]); 'UBは' choice [i] 'が負の値で' EOF'ではないはずです。それが起こらないことを保証するために 'toupper((unsigned char)choice [i]);)を使うことができました。 – chux

+0

@chux良いキャッチ – LPs

1

How to print only one time the statement if a few wrong input

  • 一つの方法は、文字列への入力をスキャンし、最初の要素を比較することでチェック他の答えがあなたに方法を示しているので、 'Y'と 'Q'に対して。

  • しかし、あなたは文字列を使用せずに第二の方法は、ループをこのように使用して入力をスキャンした後に追加の文字を消費することで、その後の文字列を使用しない場合:

    int valid=0; 
    char choice; 
    
    while (valid==0) 
    { 
        printf("\nDo you wish to try again (Type Y to continue Q to quit:"); 
    
        scanf("%c", &choice); 
        // remove space before format specifier as you are consuming white spaces in the below loop 
    
    
        //consuming additional characters mechanism: 
    
        int consume_char; //to store consumed character (getchar() returns int) 
    
        //the below loop consumes all additional characters 
        while(((consume_char = getchar()) != '\n') && (consume_char != EOF)); 
    
    
        choice = (char) toupper(choice); 
    
        if((choice == 'Y') || (choice == 'Q')) valid= 1; 
        else printf("Error: Invalid choice\n"); // statement 
    } 
    return 0; 
    
関連する問題