我不太确定Microsoft特定的_sntscanf_s函数应该如何工作。
在我的Visual Studio 2015(14.0.25431.01 Update 3)中,使用 v140 工具包编译的以下程序的输出是:
23.00000
转换字段1
IMO哪个错误,而 v120 工具包的输出是:
0.00000
转换字段1
哪个是正确的IMO。
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR szBuffer[10];
szBuffer[0] = _T('0');
szBuffer[1] = _T('\0');
szBuffer[2] = _T('2'); // replace '2' by '\0' and it works as expected
szBuffer[3] = _T('3');
szBuffer[4] = _T('\0');
szBuffer[5] = _T('\0');
double d;
int conv = _sntscanf_s(szBuffer, _countof(szBuffer), _T("%lf"), &d);
printf("%f\n", d);
printf("Converted fields %d\n", conv);
return 0;
}
根据该计划中的评论,如果您将szBuffer[2] = '2';
替换为szBuffer[2] = '\0';
,则按预期工作(输出:0.00000
)。
如果这一行:
int conv = _sntscanf_s(szBuffer, _countof(szBuffer), _T("%lf"), &d);
替换为:
int conv = _sntscanf_s(szBuffer, _tcslen(szBuffer), _T("%lf"), &d);
无论工具包如何,输出始终为0.00000
。
对我而言,这看起来像一个错误。据我了解,扫描应该在遇到的第一个NUL字符处停止。
还有其他人遇到过这个问题吗?