エミュレートしようとしているのがprintf
の場合は、バッファを必要としないため問題はありません。見つけたときに各トークンをコンソールに書き出します。
sprintf
をエミュレートする場合は、質問を更新する必要があります。
sprintfの場合。 。 。拡張可能な文字列バッファを使用します。
自分でロールバックした場合は、512バイトの妥当なバッファから始めます。この制限に達すると、別のバッファを前回の制限(前回の1024回、2048秒など)の2倍のに割り当て、バッファ1をバッファ2にコピーし、新しいバッファを古いものに置き換え、空き/削除/最初のバッファの割り当てを解除します。
最後に、正しい長さの文字列を割り当て、バッファを文字列にコピーして返します。
あなたは結果としてバッファをバック渡す気にしない場合は、最後のステップは、それが技術的に大きすぎるとおそらくほとんどが未使用であっても、無視することができます。
更新
があるため再配置の準最適な解決策のように感じています。私が間違っている?
つまり、はいです。
これは、動的リスト&の配列が、C++ STLや.Netフレームワークのような主要なフレームワークに実装されている方法です。フォーマットが512バイトを壊す可能性があると考えている場合、1024または2048を破る可能性はどれくらいですか?文字列がそれほど長い場合、それは3つの余分なコピーです。おそらく最初の割り当てを打ち切らない80%ルールを適用することができます(最初の割り当てを64バイトに落として80/20ルールを適用することも可能)
今すぐ検討してくださいあなたの代わりに、フォーマットされるアイテムを2回通過させます。
32ビット整数の場合は、文字列に変換して文字列の長さを調べる必要があります。リスト内のすべての項目に対して1つの余分な時間を費やすことになります。これは、変換を行うバッファ、変換を実行してから文字列の割り当てを解除する時間です。 intの長さを取得することは、他のいくつかのデータ型に比べて比較的簡単です。
複雑なオブジェクトも考えてみましょう。それらの長さを取得している場合は、.ToString
というメソッドを呼び出してその表現を構築します(すべてのサブオブジェクトToString
メソッドの結果を連結します)。あなたはこれを2回行うでしょう。
拡張可能な文字列バッファの間にトスがあり、すべての文字列を構築して長さを増やす余分な時間が1つありますか?私はいつもバッファーのために行くだろう。
使用している言語を指定すると役立ちます。 'printf()'は[いくつかのプリミティブ](http://en.wikipedia.org/wiki/Printf_format_string#Format_placeholders)のみを理解しています。あなた自身で書く場合を除いて、printfに任意の型を渡すことはできません。どうか明らかにしてください。 –
@Beaks - もしあなたが 'printf("%s "、myString)'のようなことをして、あなたが割り当てた固定幅のバッファに書いているとすれば、どういう意味になるのですか? – ckhan
@ si14:バッファに書き込む必要があるのはなぜですか? printfがストリームに書き込むと、呼び出し元が十分に大きいバッファをsprintfに渡します。 – ckhan