2017-12-17 1 views
1

stdinから1桁の数字を取得しようとしています。 scanf("%d",&choice);を使用すると、3fjiosまたはfjaifdjのような数字が入力された場合、その数字の後ろにすべてが保持されるため、後でscanf("%s",name);を受け取ると、他の文字がかかりすぎてしまいます。また、scanfを使用すると悪いです(またはGoogleからそうだと思われます)。fgetsを使用して番号を取得し、後でstdinを消去する方法、他に何も役立たなかった

多くの掘り出しの後、私はfgetsを使用して入力を文字列に読み込んで解析する必要があることを理解しています。 しかし、!その後、バッファを適切にクリアする方法については説明しません。 私のような何かを行うのであれば:

char choice[3]; 
do { 
    fgets(choice, 3, stdin); 
    scanf("%*[^\n]"); 
    scanf("%*c");//clear upto newline 
} while (choice[1] != '\n'); 

を、これは私が長い2文字以上の文字列を入力する場合にのみ機能します。 fgetsの1つの文字を入力すると、scanfは実際に別の入力を待っています...これは悪いです。

2つ以上の文字(数字と'\n')を入力すると、最初の2文字はchoiceに入り、残りはバッファにスタックされます。それをクリアするためのすべてのアプローチは、最初に原子力発電所を建設する必要があるようです... また、ユーザーが無限に長い文字列を入力するとどうなりますか?

ユーザーは、(未知の)長さの文字列を入力し、最初に正確に1桁の数字が含まれているかどうかを正しく確認してから、'\n'を入力することができますか? 他の入力は、ユーザーからの新しい入力を再度取得するためにループバックする必要があります。 複雑なソリューションを使用しないでください。標準のシンプルなC言語のみを使用してください。

私は、おそらくユーザーからの入力を得て、この単純な技術的なことで6時間を無駄にするとは思えません。実際の問題を解決するのは簡単でした...

+0

'fgets'を使用する必要がありますか、あるいはCで可能な解決策はありますか? – Elyasin

+0

問題は、 '456'を入力するとコードで2番目のループの' 6'を保持するということです。 –

+0

'%d'のscanfだけを返し、残りの値を破棄して戻り値を確認してください。 –

答えて

2

scanfは使用しないでください。物事が過度に複雑になっています。 getcharを使って行を読み、捨ててください。例:

int read_input(void) { 
     int n; 

     n = getchar(); 
     if(getchar() == '\n' || n == EOF) 
       return n; 
     else 
       do n = getchar(); while (n != '\n' && n != EOF); 
     fputs("invalid entry: ", stderr); 
     return read_input(); 

} 
int main(void) { 
     int input; 
     input = read_input(); 
     printf("user entered: %c\n", input); 
     return EXIT_SUCCESS; 
} 
+0

ありがとう、私は質問があります: この行: if(getchar()== '\ n' || n == EOF) 何のn == EOFですか? stdinから読み込んでいれば、ファイルの終わりはありませんか?このビットを説明していただけますか? – user7387595

+0

'printf 5 | cmd'(cmdはあなたの実行ファイルです)。その場合、getcharへの最初の呼び出しは ''5'(ローカル文字セットの5の整数値)を返します。 getcharの2回目の呼び出しはEOFを返します(これは「char」ではありません。整数値です)。私のコードはファイルの終わりをうまく扱いません。 stdinをttyとコンバートしないでください。stdinがttyに接続されていても、getcharがEOFを返す入力ストリーム(Linuxでは^ d)を閉じることができます。 –

関連する問題