ホームページ  >  に質問  >  本文

linux - snprintf を使用して元のコンテンツといくつかの新しいコンテンツを配列に出力するにはどうすればよいですか?

snprintfこの関数には指定された長さが必要であり、コンパイラは範囲外チェックを実行するため、ターゲットの長さがすべてのパラメータの合計よりも長いことを確認する必要があります。ただし、次の手順を考慮してください:

リーリー

このプログラム -Wall を開くと、エラーが報告されます:

リーリー

実際に境界を越える可能性があるため、このエラーは予期されています。そこで問題は、エラーを報告せずに同じ関数を完了するにはどうすればよいでしょうか?

私の gcc バージョンは比較的新しい 7.1.1 です。古いバージョンのコンパイラではこのエラーは報告されないと推定されています。

仅有的幸福仅有的幸福2701日前823

全員に返信(1)返信します

  • PHP中文网

    PHP中文网2017-05-27 17:46:46

    まずsnprintf()的第二个参数代表的是缓冲区的大小,在这里应该是LENGTHsizeof(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 calling sprintf(), snprintf(), vsprintf(), and vsnprintf(). Depending on the version of gcc(1) にテキストを追加します。ただし、sprintf()

    vsprintf() を呼び出すときにソース バッファと宛先バッファが重複する場合、結果は未定義であることが標準で明示的に記載されています。使用されている gcc(1) のバージョンと、使用されているコンパイラ オプションによっては、上記のような呼び出しでは期待どおりの結果が得られません。

    つまり、元のバッファと宛先のバッファが重なっている場合、これらの printf() ファミリ関数の実行結果は不定になります。

    それでは、「元のコンテンツといくつかの新しいコンテンツを配列に出力」するにはどうすればよいでしょうか? 1 つの方法は、snprintf() に渡されるバッファを配列内の文字列の末尾に設定することです。 リーリー

    それでは、バッファの末尾にデータを継続的に追加するにはどうすればよいでしょうか?

    関数ファミリーの戻り値が印刷文字数 (印刷文字数) であることに注意してください。この場合、次のように呼び出すことができます: printf() リーリー

    結果は

    リーリー

    返事
    0
  • キャンセル返事