snprintf
この関数には指定された長さが必要であり、コンパイラは範囲外チェックを実行するため、ターゲットの長さがすべてのパラメータの合計よりも長いことを確認する必要があります。ただし、次の手順を考慮してください:
このプログラム -Wall
を開くと、エラーが報告されます:
実際に境界を越える可能性があるため、このエラーは予期されています。そこで問題は、エラーを報告せずに同じ関数を完了するにはどうすればよいでしょうか?
私の gcc
バージョンは比較的新しい 7.1.1
です。古いバージョンのコンパイラではこのエラーは報告されないと推定されています。
PHP中文网2017-05-27 17:46:46
まずsnprintf()
的第二个参数代表的是缓冲区的大小,在这里应该是LENGTH
,sizeof(LENGTH)
的值是4
(我猜你想写的应该是sizeof(cache)
吧)。那么,改成snprintf(cache, LENGTH, "%s/ruaruarua", cache);
それで十分ですか?この例を見てみましょう:
この例では、buf
の末尾に文字列を追加しようとしています。出力を見てください
期待した結果が得られませんでした。どうしてこれなの? snprintf()
のマニュアルには次のような文章があります:
一部のプログラムは、次のようなコードに軽率に依存しています
リーリー、
buf
. However, the standards explicitly note that the results are undefined if source and destination buffers overlap when callingsprintf()
,snprintf()
,vsprintf()
, andvsnprintf()
. Depending on the version ofgcc(1)
にテキストを追加します。ただし、sprintf()
、vsprintf()
を呼び出すときにソース バッファと宛先バッファが重複する場合、結果は未定義であることが標準で明示的に記載されています。使用されているgcc(1)
のバージョンと、使用されているコンパイラ オプションによっては、上記のような呼び出しでは期待どおりの結果が得られません。つまり、元のバッファと宛先のバッファが重なっている場合、これらの
printf()
ファミリ関数の実行結果は不定になります。
それでは、「元のコンテンツといくつかの新しいコンテンツを配列に出力」するにはどうすればよいでしょうか? 1 つの方法は、snprintf()
に渡されるバッファを配列内の文字列の末尾に設定することです。
リーリー
関数ファミリーの戻り値が印刷文字数 (印刷文字数) であることに注意してください。この場合、次のように呼び出すことができます: printf()
リーリー
リーリー