我使用embarcadero Xe7。我发现swscanf返回错误的结果。
例如
int _tmain(int argc, _TCHAR* argv[])
{
char *t1= " ";
wchar_t *t2= L" ";
int i1, i2;
i1= -1;
i1= sscanf (t1, "%d", &i2);
if(i1!=EOF)
printf("sscanf output i1=%d i2=%d\n", i1, i2);
else
printf("sscanf EOF\n");
i1= swscanf(t2, L"%d", &i2);
if(i1!=EOF)
printf("swscanf output i1=%d i2=%d\n", i1, i2);
else
printf("swscanf EOF\n");
return 0;
}
结果:
sscanf EOF
swscanf output i1=1 i2=0
第一个结果是好的。但第二个是错误的。
答案 0 :(得分:1)
这是一个错误。 swscanf()
的这种行为与C11标准相矛盾:
7.29.2.4/3 如果在第一次转换(如果有)之前发生输入故障,swscanf函数将返回宏EOF的值 完成。否则,swscanf函数返回输入的数量 分配的项目,可以少于提供的项目,甚至是零项目 早期匹配失败的事件。
显然,这里在第一次转换开始之前失败了。
它也与XE7 sscanf/swscanf documentation:
相矛盾如果sscanf尝试读取字符串结尾,则返回EOF。
再次,显然,在这里它试图读取字符串的结尾。
目前在EDN上没有错误报告。你应该提交一份。
*解决方法:一起处理案例i1 == EOF和i1 == 0,因为在这两种情况下都无法利用任何变量的内容。