2016-07-28 1 views
-5

誰かが意味し、Cなぜこの文はscanf文で '&'記号を必要としないのですか 'scanf( "%* [ n]%[^ n]"、arr);'

scanf("%*[\n]%[^\n]",arr); 

のこの文の作業を説明できますか?

+2

私は、完全なコードを投稿するので、この質問をトピックとして閉じるよう投票しています。 –

+4

より良い質問は、あなたが思っていること、なぜそれを考えるのか、そしてプログラムの動作があなたの期待に合わない場合は、より鋭い方法で具体的な助けを求めることです。 –

+1

'arr'がどのように宣言されているかを調べる必要があります。 – FredK

答えて

2

は、私たちはそれを打破してみましょう:

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); 
2

scanfはしばしばcharアレイを充填するために使用されます。

char arr[99]; 

機能、it's converted to a pointer to first elementへの引数として指定:つまり、arrは次のように宣言された配列は、です。つまり、scanfは、%[フォーマット指定子を想定しているのと同様に、配列の最初の要素へのポインタを受け取ります。

これは可能なバッファオーバーフローの例です。この例では、1行のテキストを読み込みます。行が長い場合(私の例では98バイト以上)、scanfはバッファオーバーランを引き起こします。あなたの例は実際にはgetsとよく似ていますが、その原因となる可能性があるオーバーランや防止できないオーバーヘッドのために推奨されていません。たとえば、説明されているように、フォーマットの境界を使用します。 here

+2

クリスタルボール? 'arr'はどこにも宣言されていません。 – Olaf

+0

ええ、そのボール...しかし、配列のサイズはボールでややぼんやりしていたので、私はただ99を推測しました。 – anatolyg

関連する問題