2012-01-18 9 views
8

私は、現在のディレクトリパスに\のinit.scmを追加するsprintf(newpath, "%s%s", cCurrentPath, "\\init.scm");を使用していますが、通常の警告があります: sprintfの類義語(newpath、 "%s%s"、...)は何ですか?

Sprintf_s

warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

は、このような "%S%S" の文字列をサポートしていませんが和。 sprintf_sを使ってどうすればいいですか?

+0

"Sprintf_sは、このような"%s%s "文字列の合計をサポートしていませんか?本気ですか? – Mat

+0

はい、それは警告C4024を表示します: 'sprintf_s':正式なパラメータと実際のパラメータ2の異なるタイプ2 \tと実行に失敗しました – Cynede

+0

これはあなたのコードのバグです。(これは普通、あなたが文字列について話すときに連結と呼ばれます。 。 – Mat

答えて

14

sprintf_sは基本的にsprintfと同じであるが、それは別のパラメータを取得:

sprintf_s(newpath, sizeof(newpath), "%s%s", cCurrentPath, "\\init.scm"); 

注 - newpathは、通常の文字列、sizeof(newpath)作品がある場合。引数として渡されたポインタまたは配列の場合は、サイズを取得するために別の方法が必要な場合があります。
非MS環境でも同じ目的でsnprintfを使用することができます(ただし動作​​は異なります)。

+0

%s%sはnewpathに行く2つの文字列の合計です。それを作る方法? – Cynede

+0

_s関数は安全のために構築されているため、割り当てられていないメモリは上書きしません。このため、2番目のパラメータは1番目のパラメータに割り当てられたメモリのサイズでなければなりません)。次のパラメータでは何もありません。実際のテキストが予想より長くなった場合、メモリアクセス違反は発生しません。 –

+0

申し訳ありませんが、フォーマット文字列を省略しました。今修正しました。私が書いたのと同じように使っています。 – ugoren

関連する問題