エミュレートしようとしているのであればprintf
、問題はありません。バッファーは必要ないため、見つけたときに各トークンをコンソールに書き込みます。
エミュレートしようとしている場合はsprintf
、質問を更新する必要があります。
sprintf の場合。. . 拡張可能な文字列バッファを使用します。
自分でロールバックする必要がある場合は、512 バイトの妥当なバッファーから始めてください。この制限に達すると、以前の制限の2 倍の別のバッファーを割り当て (最初は 1024、2 回目は 2048 など)、バッファー 1 をバッファー 2 にコピーし、新しいバッファーを古いものと交換して、破棄/解放/削除/割り当て解除します。最初のバッファ。
終了したら、正しい長さの文字列を割り当て、バッファを文字列にコピーして返します。
バッファが技術的に大きすぎて、おそらくほとんど使用されていない場合でも、結果としてバッファを返すことを気にしない場合、最後のステップは無視できます。
更新
再割り当てのため、次善のソリューションのように感じます。私が間違っている?
一言で言えば、そうです。
これは、動的リストと配列が C++ STL や .Net フレームワークなどの主要なフレームワークに実装されている方法です。フォーマットが 512 バイトを破る可能性を考慮した場合、1024 または 2048 を破る可能性はどれくらいですか? 文字列が長くなった場合、それは 3 つの余分なコピーです。おそらく、80% の確率で最初の 512 制限に達することはないという 80/20 ルールを適用できます (最初の割り当てを 64 バイトに落として、80/20 ルールを適用することもできます)。
ここで、書式設定する項目を 2 回パスするという別の方法を検討してください。
32 ビットの int がある場合、それを文字列に変換して、文字列の長さを調べる必要があります。リスト内のすべての項目に対して、変換を行うためのバッファーの割り当て、変換を行う時間、および文字列の割り当てを解除するための余分な時間を 1 回行います。int の長さの取得は、他のデータ型に比べて比較的簡単です。
複雑なオブジェクトについても検討してください。それらの長さを取得している場合、それらの表現は (おそらく) いくつかの.ToString
ようなメソッドを呼び出すことによって構築されます。これは、すべてのサブオブジェクトToString
メソッドの結果を一緒に連結します。また、これを行うことになります。二回。
拡張可能な文字列バッファーをトスし、すべての文字列を 1 回余分に構築して長さを取得するとしたら? 私は毎回バッファに行きます。