2016-06-15 4 views
-2

私はに関する問題に直面しています。この問題をここで多く探していて、多くの似たようなものを見つけたので、この質問に重複しないでください。なぜこのC scanfが自動的にスキップされるのですか?

私はこれを実行すると:

char c; 
int a, b; 

scanf("%d", &a); 
scanf("%c", &c); 
scanf("%d", &b); 

を次に最初の2 scanfが正常に働いていたが、第3回1が完全にスキップされます。私はこのフォーラムのさまざまな投稿を検索してこの問題について調べ、多くの情報を見つけましたが、何か他のものを知りたいと思っています。

私はすでに見つかっ最も簡単な解決策は、あろうこと:

scanf("%d %c %d", &a, &c, &b); 

、別のソリューションを使用している可能性:

getchar(); 

そして、私はまた、私の問題の背後にある理由は、それが余分に書き込みされていることがわかります新しい行の文字\nをバッファに追加したので、3番目の行はスキップされました。しかし、さらに研究するために、別のscanfcharタイプを使用した場合、2番目のscanfの後にそれが動作することがわかりました。つまり、私の場合、charタイプの後にintegerタイプの入力を取ると問題が発生します。私はもう一度多くの人が逆の場合に問題があったことを見て、integerの後にcharの入力を取ることができなかった。今私はscanfのCでサポートされている正確なスキームについて明らかにしたいと思います。これは、同様の問題に直面する理由と、なぜcharcharの後にスキャンできるのですが、integerはスキャンできません。ありがとうございます。

+4

私はあなたがそれを言う方法に問題があると思っています。他の人が持っている他のものが実際の問題です。 –

+1

scanfはスキップされません。 scanfの結果が何であるかを調べるには、戻り値を確認してください。 –

+0

特定のコードについてのヘルプを得るには、[MCVE](http://stackoverflow.com/help/mcve)を投稿し、入力した入力内容を正確に指定してください。 –

答えて

7

"%d"フォーマット指定子には、先頭の空白をスキップします。 "%c"フォーマットはそれを持っていません、それはどんな種類の文字であっても、入力バッファの次の文字を読み込みます。

"%c"形式を使用して先頭の空白をスキップする場合は、scanfに書式文字列のスペースを明示的に指定する必要があります。 " %c"

+0

ありがとう...私はそれを得た –

2

これは、「intの後にcharを取ることができない」と同じ問題があります。

リコールもし%d形式指定子とscanfを使用して入力からintを読んだときに、番号を表す文字が消費、それ以下のセパレータはないれていること。このように見えるのバッファを考えてみましょう(私はスペースを示すために、アンダースコアを使用):最初のscanf

char  9 8 _ x _ 7 6 
     - - - - - - - 
position 0 1 2 3 4 5 6 
  • はあなたのバッファがゼロに位置している呼び出します。
  • 最初の呼び出し後、バッファの位置は2になります。
  • 二呼び出すあなたのバッファはスペースがあなたのchar

ために読み込まれるので、今の問題が明らかになり、3に配置された後:そう、intを読むための第三scanfしようとしますが、バッファがxであります読み取りは不可能です。

関連する問題