1. ホーム
  2. c

[解決済み] snprintf() は常に null 終端ですか?

2023-03-17 13:40:46

質問

snprintfは常に宛先バッファをNULL終端するのでしょうか?

言い換えれば、これで十分なのでしょうか。

char dst[10];

snprintf(dst, sizeof (dst), "blah %s", somestr);

とか、somestrが長いとこうしないといけないの?

char dst[10];

somestr[sizeof (dst) - 1] = '\0';
snprintf(dst, sizeof (dst) - 1, "blah %s", somestr);

私は、標準に書かれていることと、人気のある libc が標準的な動作ではないことを行うかもしれないことの両方に興味があります。

どのように解決するのですか?

他の回答が確立しているように それは :

snprintf ... 結果を文字列バッファに書き込む。(...) は、buf_sizeが0でない限り、ヌル文字で終端する。

つまり、あなたが注意しなければならないのは、ゼロサイズのバッファを渡さないということです。


しかし 注意 そのマイクロソフトのライブラリ は持っていません。 という関数があります。 snprintf という関数はなく、代わりに 歴史的に だけ という関数がありました。 _snprintf (先頭のアンダースコアに注意) という関数を持っていて を追加しません。 を付加しません。以下はそのドキュメントです (VS 2012, ~~ VS 2013)。

http://msdn.microsoft.com/en-us/library/2ts7cx93%28v=vs.110%29.aspx

<ブロッククオート

戻り値

フォーマットされたデータ文字列の長さをlenとする(終端NULLは含まない)。 lenとcountは_snprintfの場合はバイト数、_snwprintfの場合はワイド文字数です。 文字です。

  • len < countの場合、lenの文字がバッファに格納され、ヌルテニアが付加され、lenが返される。 ヌルターミネータが付加され、lenが返されます。

  • len = count ならば、len 文字がバッファに格納される。 no null-terminatorが付加され、lenが返されます。

  • len > count の場合、カウントされた文字がバッファに格納されます。 no が付加され、負の値が返されます。

(...)

ビジュアル スタジオ 2015 (VC14) では、どうやら準拠した snprintf 関数が導入されましたが、レガシーなものでは先頭のアンダースコアと 以外の のようなヌル末端動作はまだ残っています。

snprintf 関数は、lenがcountより大きいか等しい場合に出力を切り詰めます。 にヌルターミネータを置くことで、出力を切り詰めます。 buffer[count-1] . (...)

すべての関数について その他 よりも snprintf len = count の場合、len の文字がバッファに格納されます。 ヌルターミネータは付加されません。 , (...)