[解決済み] snprintf() は常に null 終端ですか?
質問
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 の文字がバッファに格納されます。 ヌルターミネータは付加されません。 , (...)
関連
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
未定義の `__isoc99_sscanf' への参照
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] Xcode - 警告。C99 では関数の暗黙の宣言は無効です。
-
[解決済み] mallocとcallocの違い?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?
-
[解決済み】CとC++におけるユニオンの目的
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?