2
printf("%s%d%c", s, a, c);

文字列はstdoutに出力されます。しかし、実装は、結果を保持するchar配列のサイズを定義することをどのように知っていますか?

または、別の方法は、固定サイズのバッファーを使用し、フォーマット文字列の背後にある各変数引数を処理し、解釈された文字列サイズがバッファーサイズを超えている場合は、それを出力ストリームに出力します。これは本当ですか?

ちなみに、C ++の文字列型、その実装では、ヒープメモリ、動的メモリアロケータを使用します。これは正しいですかnewdelete

4

3 に答える 3

4

文字列はstdoutに印刷されます

そのとおりです。これはストリームであり、char[]は必要ありません。sprintf()だけが文字列バッファサイズを推測する必要があります。

于 2012-07-08T17:08:43.857 に答える
1

他の人が説明しているように、ストリームprintfに書き込むときに出力バッファを割り当てる必要がないため、事前に出力バッファのサイズを知る必要はありません。FILE*

ただし、疑問に思うかもしれません。ストリームに書き込まないprintf-familyの関数はどうでしょうか。たとえば、割り当てられた文字列を返す非標準関数についてはどうでしょうか。FILE*asprintf

printf関数ファミリーの基礎となる実装は、ドライランを実行できます。つまり、実際にメモリに書き込むことなく操作の実行をシミュレートし、書き込んだはずcharのsの数を追跡できます。その数を計算すると、適切なサイズのバッファを割り当てて、実際に操作を繰り返すことができます。これは、を呼び出すときなど、呼び出し元がバッファー自体を割り当てる必要があるときに行うことです。snprintf

(バッファリングされたI / Oについても話します。それprintfを使用することはできますが、printf必ずしもバッファ自体について知っているとは限りません(おそらく、そうすべきではありません)。fputcこれは、何回も呼び出すcharと考えることができます。バッファがいっぱいの場合はフラッシュします。)

于 2012-07-08T19:01:52.133 に答える
0

しかし、実装が結果を保持するchar配列のサイズを定義することをどのように知っているか

nullの終了バイトまで読み取るだけ'\0'です。"%s%d%c"として渡されるのサイズを明示的に知る必要はありませんchar *

于 2012-07-08T18:01:44.050 に答える