2016-09-23 9 views
0

は、私は、コード、私は私がに入力された4つの以上の文字を持っている場合、バッファをクリアされ、ここでテストしようとしています何クリーニング標準入力バッファの問題

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

int main() { 
    char choice; 
    char name[5] = ""; 
    do { 
     printf("a = new name or anything else to quit\nChoice: "); 
     choice = getchar(); 
     //not doing any error handling....assuming you only click 'a' 
     switch (choice) { 
      case 'a': 
       getchar(); 
       printf("Enter a name which is 4 characters or less: "); 
       fgets(name, 5, stdin); 
       printf("Name: %s\n", name); 
       char c; 
       while ((c = getchar()) != '\n' && c != EOF); 
       printf("%c", c); 
       c = '\0'; 
       break; 
      default: 
       break; 
     } 

    } while (choice == 'a'); 
    printf("Ending.....press enter now"); 
    getchar(); 
    return 0; 
} 

の以下の部分を持っていると言います。私は4文字以上の名前を持つたびにうまく動作しますが、3文字以下の文字を入力すると、問題はwhileループになります。それはstdinバッファからgetchar()が必要ですが、これは空です。この問題を回避するには、どのような方法がありますか?

+0

私は本当にしないでください何を求めているのか理解していますが、getchar()はcharではなくintを返します。あなたは、最大5文字を取得した後に改行を探しているようですが、これは大丈夫ですが、fgetsを使用しているためgetchar()の代わりにfgetcを使用し、何らかの理由でgetchar()が同じバッファをfgets()として実行すると、すべてのベットはオフになります。また、fgetsは文字列を終わらせる必要がないので、5の代わりに4を渡し、name [4] = '\ 0'を設定したいと思うかもしれません。直後の。これはちょっとした助けになるかもしれませんが、質問を言い換えることもできます。 – Alex

+0

名前 "abc"を入力します。例えば、名前[3]に格納されているものは '\ n'になります。現在、バッファには何もないので、whileループは空のバッファからgetchar()を呼び出すため、そこにスタックされています。 –

答えて

1

nameに改行文字が含まれているかどうかを確認する必要があります。もしそうであれば、バッファには何もないので、それをフラッシュする必要はありません。

fgets(name, 5, stdin); 
    printf("Name: %s\n", name); 
    if (strchr(name, '\n') == NULL) { 
     int c; 
     while ((c = getchar()) != '\n' && c != EOF); 
    } 
+0

ahhhhこれは動作します....文字列に '\ n'が含まれていない場合は、バッファに入っていることがわかります! –

1

我々はすでにmy answer to your previous questionの解説に渡しでこれを議論しました。バッファに空きがある場合、fgets()は終端改行を消費し、バッファに入れます。バッファ内の改行を検索することで、それが行われたかどうかを判断できます。例えば、'\0'でそれを置き換えることで - あなたは1を見つけた場合は、

  1. あなたはおそらくそれを削除します。

  2. ストリームがすでに次の行に進んでいるため、入力行の末尾を削除しないでください。

+0

名前が 'ab \ n'であれば何を言っているのですか.... fgetsはその改行文字をバッファに入れません。それは名前[2]のままです。あなたの前の応答は、私が探していたものです –

+0

@ YusufJama、dbushの答えはまさに私と同じことです。しかし、是非、あなたが彼を好むなら、それはあなたが受け入れるべきものです。 –

+0

[最近の質問](http://stackoverflow.com/questions/39667485/why-use-eof-to-check-if-stdin-buffer-is-cleared)では、入力が十分に短い場合は、 'newline'が入力文字列に入ります。バッファにクリアする項目はありませんが、 'newline'がエントリにない場合に限ります。どのように動作するかを尋ねる前に、使用している各機能のマニュアルページをお読みください。 –

0
  1. fgets()の結果を確認してください。コードがそうでない限り、nameの内容を使用することは未定義の動作かもしれません。魔法の数を避ける:sizeof nameを使用してください。 name[]可能性'\n'ため

     // fgets(name, 5, stdin); 
         if (fgets(name, sizeof name, stdin) == NULL) Handle_EOF(); 
    
  2. ルック。

     char *eol = strchr(name, '\n'); 
    
    他の1が検出された場合は、ヌル文字で上書き
  3. 、行の残りの部分を消費

     if (eol) { 
          *eol = '\0'; 
         } else { 
          int ch; 
          while ((ch = getchar()) != '\n' && ch != EOF); 
         } 
    
  4. 印刷name[]

     printf("Name: %s\n", name); 
    
関連する問題