私はこの構文と混同しています。最初は本の印刷ミスかと思いました。しかし、かなり長い間プログラミングをしているうちに、それらが異なる意味を持っていることを知りました。それでも、その構文について明確なビジョンを得ることができません。
同様に、次の違いは何ですか:
gets( str);
と
gets(str);
空白は重要ですか?はいの場合、どのように?
scanf
フォーマット文字列にスペースを追加するときは、scanf
空白を読み取ってスキップするように指示します。たとえば、入力の改行をスキップすると便利です。また、フォーマットによっては空白を自動的にスキップすることにも注意してください。
関数のファミリの良いリファレンスについては、たとえばここを参照してください。scanf
の違い
gets(str);
と
gets( str );
全くありません。文字列リテラル以外の実際のコードは、任意の量の空白でフォーマットできます。上記の呼び出しを次のように書くこともできます
gets
(
str
)
;
それは今でも同じだろう。
ああ、このgets
関数はずっと前から廃止されており、最新の C 標準からも削除されています。fgets
代わりに使用する必要があります。
フォーマット文字列内の空白 (空白、タブ、改行など) は、入力内のnoneを含む任意の量の空白と一致します。
http://www.manpagez.com/man/3/scanf/
スペースではgets
何の意味もありません。コンパイル時には無視されます。
ここで scanf について学ぶべき重要なことが 2 つあります。
次のように、すべての空白を無視するこの動作を明示的に呼び出すことができます。
scanf(" %c", &mychar)
scanf("\n%c", &mychar)
scanf("\t%c", &mychar)
つまり、変換文字列内の空白文字 (スペースを含む) は、スキャンされた項目までのすべての空白を無視するように scanf に指示します。
%c と %[ を除くすべての変換修飾子はこれを自動的に行うため、 vs に関する最初の質問に対する答えscanf("%s")
はscanf(" %s")
、違いはないということです。
C FAQ の scanf に関する質問をすべて読み、すべてをよりよく理解するためにいくつかのテスト プログラムを作成することをお勧めします。