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
匹配,或者如果您没有将它们与正确的参数匹配,则会引发内存/页面错误异常