誰かが意味し、Cなぜこの文はscanf文で '&'記号を必要としないのですか 'scanf( "%* [ n]%[^ n]"、arr);'
scanf("%*[\n]%[^\n]",arr);
のこの文の作業を説明できますか?
誰かが意味し、Cなぜこの文はscanf文で '&'記号を必要としないのですか 'scanf( "%* [ n]%[^ n]"、arr);'
scanf("%*[\n]%[^\n]",arr);
のこの文の作業を説明できますか?
は、私たちはそれを打破してみましょう:
scanf("%*[\n]%[^\n]",arr);
%*[\n]
はが'\n'
ている任意の文字を読み取ることがscanf関数を指示します。 *
は何も保存しないことが示されています。少なくとも1文字を読み取らない場合、scanf()
はEOFを返します。 EOF
まで、または次の文字が'\n'
にならなくなるまで続けます。
%[^\n]
は、'\n'
以外の文字を読み取るようにscanfに指示します。これらの値はarr
で示されるメモリに保存されます。これは、次の文字が'\n'
またはEOFになるまで続きます。文字が読み取られない場合、0(またはEOF)が返されます。少なくとも一方が読み取らず、エラーした場合行う場合、\0
は、添付されてない入力の制限がないのでscanf()
戻る1.
OPのコードは良いコードではありません。以下の方が良いでしょう。 fgets()
を使用する方がさらに優れています。 Cにおいて
char arr[10];
scanf("%*[\n]%9[^\n]",arr);
、scanf
はしばしばchar
アレイを充填するために使用されます。
char arr[99];
機能、it's converted to a pointer to first elementへの引数として指定:つまり、arr
は次のように宣言された配列は、です。つまり、scanf
は、%[
フォーマット指定子を想定しているのと同様に、配列の最初の要素へのポインタを受け取ります。
これは可能なバッファオーバーフローの例です。この例では、1行のテキストを読み込みます。行が長い場合(私の例では98バイト以上)、scanf
はバッファオーバーランを引き起こします。あなたの例は実際にはgets
とよく似ていますが、その原因となる可能性があるオーバーランや防止できないオーバーヘッドのために推奨されていません。たとえば、説明されているように、フォーマットの境界を使用します。 here。
私は、完全なコードを投稿するので、この質問をトピックとして閉じるよう投票しています。 –
より良い質問は、あなたが思っていること、なぜそれを考えるのか、そしてプログラムの動作があなたの期待に合わない場合は、より鋭い方法で具体的な助けを求めることです。 –
'arr'がどのように宣言されているかを調べる必要があります。 – FredK