- ベストアンサー
VS2005 での修正
VC++6.0 から VS2005 への変更で困っています。 char header[0x4000]; のとき、 第2引数は sprintf_s( header, 0x4000-1,"Content-description:" ); strcat_s( header,0x4000, tmpstr1 ); strcpy_s(header,0x4000, tmpstr1); とするのでしょうか? それとも、すべて 0x4000 とするのでしょうか? 1000箇所を超える修正で泣いています。 マイクロソフトさん、かんべんして!! よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
sprintf_sでも第二引数の-1の調整(?)は必要ないと思います。 MSDNの記述が微妙なんですが、バッファに書き込む最大文字数というのは 文字列終端のナルバイトを含めた大きさのようです。 一方で戻り値の書き込んだ長さには終端のナルバイトはカウントされていないのですが。 sprintf_s(buf, 12, "%s", "hello, world"); とやると、ナルバイトの分バッファ長が足りなくなると判定されるので 例外が発生します。 あとMSDNの日本語版は英語版を訳しただけのもので、英語版の記述は マルチバイト環境のことは基本的に考慮していないので、 説明文に「文字数」とあってもそれがShiftJISでの「文字数」と一致するものではありません。
その他の回答 (3)
- PROMETHEUS
- ベストアンサー率58% (31/53)
>1000箇所を超える修正で泣いています。 多分セキュアな関数への移行(警告が出るため)でのことだと思いますが、移行する必要があるのでしょうか? 既に動いている&修正箇所が大量なら pragmaか _CRT_SECURE_NO_WARNINGSを事前に定義しておくなどして警告を抑制する方向でもいいのでは。
お礼
ありがとうございます。 ソフト作りは下手なので 警告をたくさん出るように設定し それを減らすことで よりましなソフトにしようと思っています。
- aris-wiz
- ベストアンサー率38% (96/252)
MSDNを調べれば分かることだと思いますが。。。 参考URLのツリーから探すと良いかも。 int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format, [argument] ... ); パラメータ buffer 出力の格納場所。 sizeOfBuffer 格納する最大文字数。 ~~~~~~~~~~文字数ね format 書式指定文字列。 argument 省略可能な引数。 locale 使用するロケール。 ******************************************** errno_t strcat_s( char *strDestination, size_t sizeInBytes, const char *strSource ); パラメータ strDestination null で終わる追加先の文字列バッファ。 sizeInBytes, sizeInWords 追加先の文字列バッファのサイズ。 ~~~~~~~~~~~~~~~~~~~~~~サイズね strSource null で終わる元の文字列バッファ。 **************************************** errno_t strcpy_s( char *strDestination, size_t sizeInBytes, const char *strSource ); パラメータ strDestination コピー先の文字列バッファの場所。 sizeInBytes, sizeInWords コピー先の文字列バッファのサイズ。 ~~~~~~~~~~~~~~~~~~~~~~サイズね strSource null で終わる元の文字列バッファ。 headerが大域変数ならsizeofで問題なかと。 もし局所変数で関数に渡して文字列処理とかしているなら、 相応に方法は考えるべきです。 例えばdefineとか、サイズを渡すとか。
お礼
ありがとうございます。 ほかの場所は ポインターに対して、 後でメモリーを確保したり、 ほかのバッファの大きさは 様々です。 -1 は必要ないのでしょうか? null の扱いで迷っています。 文字は、shift_jis です。
- sakusaker7
- ベストアンサー率62% (800/1280)
sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l (CRT) http://msdn2.microsoft.com/ja-jp/library/ce3zzk1k(VS.80).aspx とか strcat_s、wcscat_s、_mbscat_s http://msdn2.microsoft.com/ja-jp/library/d45bbxx4(VS.80).aspx を見る限りではどちらも -1 する必要はないと思いますが。 > 1000箇所を超える修正で泣いています。 質問にあるパターンならば、sizeof header で問題ないのではないでしょうか?
補足
null が最後にはいると 文字数が一つ減る と思ったのです。 それで -1 としたのです。 また、 shift_jis だと、漢字などは1文字ですが 2文字として数える そんなふうに思っていたのです。
お礼
ありがとうございます。 -1をつけるのは面倒なので 助かりました。