私はこのコードをいくつかのコードで見ました。私はgoogleに関するドキュメントを見つけることができません。誰かが何をしているのか説明してもらえますか?_stscanf_sの機能は何ですか?
ありがとうございました。
私はこのコードをいくつかのコードで見ました。私はgoogleに関するドキュメントを見つけることができません。誰かが何をしているのか説明してもらえますか?_stscanf_sの機能は何ですか?
ありがとうございました。
http://msdn.microsoft.com/en-us/library/tsbaswba%28VS.80%29.aspxを参照してください:sscanf_s
の総称です。
編集:便宜的に文書化されているhere。 _stscanf_s
は、WindowsプラットフォームのTCHAR.Hにあります。あなたはおそらくsscanf_s
またはswscanf_s
を使用して離れて得ることができます。
このMSDNの記事は、彼らのsscanf
代替品「安全」の_stscanf_s
変種を示しています。それはANSI文字をサポートすることができなければならないことを意味しTCHAR
変種であり、およびUnicode /マルチ
http://msdn.microsoft.com/en-us/library/t6z7bya3(v=vs.80).aspx
をアプリのコンパイル方法によって異なります。
より一般的なC/C++実装では、sscanf
に置き換えることができます。
元の質問は、safe
とこの機能の古いunsafe
バージョンの違いに関するものとします。私は同じ違いを自分自身で探していました。ここでは、_stscanf_s
は_stscanf
と異なり、%s
と%c
の指定子を扱います。 *_s
関数は、バッファのサイズがTCHAR
の数として次のパラメータに渡されると予想します。
それを説明するための最良の方法は、これらのコードサンプルである:私は5以下にbuffDate[6]
を変更した場合、それは悪い男」によって悪用される可能性がありますスタックの破損につながること
const TCHAR* pSrcBuff = L"Date: 2015-12-25";
TCHAR buffDate[6] = {0};
TCHAR chDash1 = 0, chDash2 = 0;
int year = 0, month = 0, day = 0;
//Old "unsafe" method -- DON'T USE IT!
int count_found = _stscanf(pSrcBuff,
L"%s%d%c%d%c%d",
&buffDate,
&year,
&chDash1,
&month,
&chDash2,
&day
);
if(count_found == 6) //Number of specifiers read
{
//Success
ASSERT(lstrcmp(buffDate, L"Date:") == 0);
ASSERT(year == 2015);
ASSERT(chDash1 == L'-');
ASSERT(month == 12);
ASSERT(chDash2 == L'-');
ASSERT(day = 25);
}
注意"あなたが5以下にbuffDate[6]
を設定している場合この場合
const TCHAR* pSrcBuff = L"Date: 2015-12-25";
TCHAR buffDate[6] = {0};
TCHAR chDash1 = 0, chDash2 = 0;
int year = 0, month = 0, day = 0;
//"Safe" version of the method
int count_found = _stscanf_s(pSrcBuff,
L"%s%d%c%d%c%d",
&buffDate, sizeof(buffDate)/sizeof(buffDate[0]),
&year,
&chDash1, sizeof(chDash1),
&month,
&chDash2, sizeof(chDash2),
&day
);
if(count_found == 6) //Number of specifiers read
{
//Success
ASSERT(lstrcmp(buffDate, L"Date:") == 0);
ASSERT(year == 2015);
ASSERT(chDash1 == L'-');
ASSERT(month == 12);
ASSERT(chDash2 == L'-');
ASSERT(day = 25);
}
、_stscanf_s
機能は、単に上書きせずに、失敗します。マイクロソフトは、新たな「安全な」方法を作成した理由、それは以下のような進む
buffDate
バッファの終わりです。
機能のscanf
グループは、(私の見解では)まだ危険であり、あなたが正しいパラメータでそれらを一致しない場合は、%s
と%d
を間違えた場合、メモリ/ページ・フォルト例外をスロー、またはすることに注意してください。
私はあなたの答えに感謝します。 – Kobe