#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
残りの文字から入力バッファをクリアしたいと思います。それを行うための最良の方法は何でしょうか...?
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
}
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
}
}
次のようなものを使用して\n
を探す必要があります。
/* flush unread input buffer */
while( ! strchr( name, '\n' ) )
if( ! fgets(name,(sizeof name),stdin) )
break;
注:これをバグと見なすか機能と見なすかはわかりませんが、短い名前には最後の\n
が含まれます。これにより、次のようになります。
Glad to meet you SSS
.
fgets
(私の強調)のドキュメントから:
ストリームから文字を読み取り、(num-1)文字が読み取られるか、改行またはファイルの終わりに達するまで、C文字列としてstrに格納します最初に発生した方。
したがって、入力(バッファを超える)は9文字のブロックで読み取られます(+1ヌル終了文字)。
最後に読み取られた文字が改行になるまで、fgets
を繰り返し呼び出す必要があります(\ n)。