C++ 你是干什么的?

C++ 你是干什么的?,c++,c,mfc,C++,C,Mfc,我在一些代码中看到了这个函数,但在谷歌上找不到关于它的文档。有人能解释一下它的功能吗?还有其他的替代方案吗 谢谢。请参阅:它是sscanf\u s的通用名称 编辑:这是方便的文件\u stscanf\u s位于Windows平台上的TCHAR.H中。您可能可以使用sscanf_s或swscanf_s这篇MSDN文章展示了其“安全”sscanf替代品的\stscanf_s变体: 它是一个TCHAR变体,这意味着它应该能够支持ANSI字符和Unicode/多字节,具体取决于应用程序的编译方式 您可

我在一些代码中看到了这个函数,但在谷歌上找不到关于它的文档。有人能解释一下它的功能吗?还有其他的替代方案吗

谢谢。

请参阅:它是
sscanf\u s
的通用名称


编辑:这是方便的文件<代码>\u stscanf\u s位于Windows平台上的TCHAR.H中。您可能可以使用
sscanf_s
swscanf_s
这篇MSDN文章展示了其“安全”sscanf替代品的
\stscanf_s
变体:

它是一个
TCHAR
变体,这意味着它应该能够支持ANSI字符和Unicode/多字节,具体取决于应用程序的编译方式


您可以(在某种程度上)在更通用的C/C++实现上用
sscanf
替换它。

我假设最初的问题是关于该函数的
safe
和较旧的
safe
版本之间的区别。我自己也在寻找同样的差异,这就是它的本质:它在对待
%s
%c
说明符的方式上不同于
\u stscanf
*\u s
函数期望在下一个参数中传递其缓冲区的大小,如
TCHAR
s的数量

最好的说明方法是使用以下代码示例:

    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);
    }
请注意,如果我将buffDate[6]更改为5或更低,将导致堆栈损坏,这可能会被“坏人”利用

这就是为什么Microsoft创建了一种新的“更安全”方法,如下所示:

    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);
    }
在这种情况下,如果将
buffDate[6]
设置为5或更低,则
\u stscanf\u s
功能将简单地失败,而不会覆盖
buffDate
缓冲区的结尾

请注意,
scanf
函数组仍然是危险的(在我看来),如果您将
%d
错误地与
%s
匹配,或者如果您没有将它们与正确的参数匹配,则会引发内存/页面错误异常