swscanf返回错误的结果

时间:2015-05-24 10:16:16

标签: unicode borland-c++

我使用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

第一个结果是好的。但第二个是错误的。

1 个答案:

答案 0 :(得分:1)

这是一个错误。 swscanf()的这种行为与C11标准相矛盾:

  

7.29.2.4/3 如果在第一次转换(如果有)之前发生输入故障,swscanf函数将返回宏EOF的值   完成。否则,swscanf函数返回输入的数量   分配的项目,可以少于提供的项目,甚至是零项目   早期匹配失败的事件。

显然,这里在第一次转换开始之前失败了。

它也与XE7 sscanf/swscanf documentation

相矛盾
  

如果sscanf尝试读取字符串结尾,则返回EOF。

再次,显然,在这里它试图读取字符串的结尾。

目前在EDN上没有错误报告。你应该提交一份。

*解决方法:一起处理案例i1 == EOF和i1 == 0,因为在这两种情况下都无法利用任何变量的内容。