• ベストアンサー

VS2008 C++ 書式付文字列書込み関数

VS2008 C++で文字セットはUnicode文字セットを使用しています TCHAR bur[50]; _stprintf_s(buf, 50, _T("T = %d"), 100); を実行すると「T=100」の後にNULLがきて、ここまでは正常ですが、残りの部分には0xfefeが文字列バッファの最後までコピーされます。 正常な動作なのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>文字列を初めNULLで埋めておき、必要なセクション情報を何個か追加するため _stprintf_s を使用しましたが、これを実行した直後にNULLが変ってしまいます。 NULLではない…というのは突っ込んだ後なのでいいとして…… VC++2008EEで下記のようにして確認してみました。 int _tmain(int argc, _TCHAR* argv[]) {  TCHAR buf[50] = {0};  _stprintf_s(buf, 50, _T("T = %d"), 100);  return 0; } _stprintf_s()の行にブレークポイントを置いて、DebugビルドとReleaseビルドでステップオーバーしてみました。 Debugビルドだと確かに0xfefeで埋められてしまいますね。 ライブラリ側でそういう動作をするように作られているのでしょう。 # おそらく…第2引数に指定したサイズが誤っていないか、領域を埋めるコトで # バッファーオーバーランチェック用の領域まで書き換えていないか確認する為……なのでしょう。 ちなみに、デバッグ版のランタイムが未初期化のローカル変数に突っ込むのは0xccでした。 ライブラリ側の仕様っぽいので、 >目的は「WritePrivateProfileSection」を使用していまして、この関数は最後はNULLを2つにしておく必要がある 文字列長を取得して、'\0'の後にさらに'\0'を書き込む。 という処理を追加しておいた方がいいでしょう。

その他の回答 (2)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

デバッグ版だとローカル変数とかの初期値として特定の値を設定するようにランタイム側で処理してくれていたりしますけど……。 >実行すると「T=100」の後にNULLがきて NULLではなく'\0'かと。

mtsm
質問者

お礼

回答ありがとうございます。

回答No.1

> 残りの部分には0xfefeが文字列バッファの最後までコピーされます。 このことをどうやって確認しましたか? 最初っから入ってたんじゃなくて?

mtsm
質問者

補足

回答ありがとうございます。 目的は「WritePrivateProfileSection」を使用していまして、この関数は最後はNULLを2つにしておく必要があるため、文字列を初めNULLで埋めておき、必要なセクション情報を何個か追加するため _stprintf_s を使用しましたが、これを実行した直後にNULLが変ってしまいます。 確認は「ウオッチ」ウィンドウです。

関連するQ&A

専門家に質問してみよう