web-dev-qa-db-ja.com

Cのfgets()の後に入力バッファをクリアする

#include <stdio.h>
int main()
{
  char name[10];
  for(int i=0;i<=10;i++)
  {
    printf("Who are you? ");
    if(fgets(name,10,stdin)!=NULL)
    printf("Glad to meet you, %s.\n",name);
  }
  return(0);
}

10文字を超える文字を入力すると、ループがスキップされます。

Who are you? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Glad to meet you, aaaaaaaaa.
Who are you? Glad to meet you, aaaaaaaaa.
Who are you? Glad to meet you, aaaaaaaaa.
Who are you? Glad to meet you, aaaaaaaaa.
Who are you? Glad to meet you, aaaaaaaaa.
Who are you? Glad to meet you, aaaaaaaaa.
Who are you? Glad to meet you, aaaaaaa

残りの文字から入力バッファをクリアしたいと思います。それを行うための最良の方法は何でしょうか...?

7
3lokh

nameに改行が存在することを確認してください。

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

int main(void){
    char name[10];

    for(int i=0;i<=10;i++){
        printf("Who are you? ");
        if(fgets(name,10,stdin)){
            char *p;
            if(p=strchr(name, '\n')){//check exist newline
                *p = 0;
            } else {
                scanf("%*[^\n]");scanf("%*c");//clear upto newline
            }
            printf("Glad to meet you, %s.\n", name);
        }
    }
    return(0);//Parentheses is not necessary
}
10
BLUEPIXY

fgets()'\n'を取得したかどうかを確認します。 '\n'がない場合、現在の行の一部の文字が読み取られていません。あなたは単にそれらを無視することができます。

    printf("Who are you? ");
    if (fgets(name, 10, stdin) != NULL) {
        if (!strchr(name, '\n')) {
            // consume rest of chars up to '\n'
            int ch;
            while (((ch = getchar()) != EOF) && (ch != '\n')) /* void */;
            if (ch == EOF) /* input error */;
            printf("Glad to meet you, %s.\n", name);
        } else {
            printf("Glad to meet you, %s.", name); // name includes ENTER
        }
    }
2
pmg

次のようなものを使用して\nを探す必要があります。

/* flush unread input buffer */
while( ! strchr( name, '\n' ) )
    if( ! fgets(name,(sizeof name),stdin) )
        break;

注:これをバグと見なすか機能と見なすかはわかりませんが、短い名前には最後の\nが含まれます。これにより、次のようになります。

Glad to meet you SSS
.
1
Gilbert

fgets (私の強調)のドキュメントから:

ストリームから文字を読み取り、(num-1)文字が読み取られるか、改行またはファイルの終わりに達するまで、C文字列としてstrに格納します最初に発生した方

したがって、入力(バッファを超える)は9文字のブロックで読み取られます(+1ヌル終了文字)。

最後に読み取られた文字が改行になるまで、fgetsを繰り返し呼び出す必要があります(\ n)。

1
rustyx