2011-06-27 129 views
3

私はこのコードをいくつかのコードで見ました。私はgoogleに関するドキュメントを見つけることができません。誰かが何をしているのか説明してもらえますか?_stscanf_sの機能は何ですか?

ありがとうございました。

答えて

3

http://msdn.microsoft.com/en-us/library/tsbaswba%28VS.80%29.aspxを参照してください:sscanf_sの総称です。

編集:便宜的に文書化されているhere_stscanf_sは、WindowsプラットフォームのTCHAR.Hにあります。あなたはおそらくsscanf_sまたはswscanf_sを使用して離れて得ることができます。

+0

私はあなたの答えに感謝します。 – Kobe

1

このMSDNの記事は、彼らのsscanf代替品「安全」の_stscanf_s変種を示しています。それはANSI文字をサポートすることができなければならないことを意味しTCHAR変種であり、およびUnicode /マルチ

http://msdn.microsoft.com/en-us/library/t6z7bya3(v=vs.80).aspx

をアプリのコンパイル方法によって異なります。

より一般的なC/C++実装では、sscanfに置き換えることができます。

1

元の質問は、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を間違えた場合、メモリ/ページ・フォルト例外をスロー、またはすることに注意してください。

関連する問題