sscanf不会在mingw下扫描带有“%a”的十六进制格式的浮点数

时间:2013-01-22 19:56:08

标签: c floating-point hex mingw scanf

我在windows中使用gcc 4.6.1和mingw。

我最近了解了%a格式说明符,用于以浮点十六进制表示法表示浮点数(显然在C99中)。

出于某种原因,我可以用这种方式打印漂浮物,但是我无法扫描它。

如果我替换%a的两个实例,%f我的代码处理打印并扫描浮点数就好了。

当我在传统的Unix系统(gcc 4.2.1)上运行它时,代码似乎工作正常。

我尝试过用浮动和双打来​​思考的各种变化。我尝试添加标志-std=c99,这似乎改变了它是否将数字文字视为double或float,但它没有解决我的问题。

我想知道两件事,如果其他人可以复制这个问题,以及我可以做些什么来修复它。

#include <stdio.h>
int main(){
    char buffer[1000];
    sprintf(buffer, "%la", 21.3930);

    double x = 0;
    printf("\n");
    printf(buffer);

    if(!sscanf(buffer, "%la", &x))
        printf("\nscan failed.");
    printf("\n%la", x);

    return 0;
}

输出结果为:

0x1.5649bap+4
scan failed.
0x0.000000p+0

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

MinGW使用msvcrt.dll作为其C运行时支持的主要部分。 msvcrt.dll通常不支持C99功能。

有些版本的MinGW可以为C99 I / O说明符提供自己的支持,但我还没有收集到关于哪些版本支持C99功能的详细信息。

有关其他详细信息,请参阅以下内容:

更新:看起来TDM-64 distribution of MinGW(版本4.6.1)支持scanf()系列函数中的C99说明符,其前缀名称如下:

__mingw_sscanf()
__mingw_scanf()

可能是在比4.6.1更新的版本中改进了支持(至少从版本4.6.1看起来这些功能不在32位版本的TDM发行版中 - 请记住,TDM -64能够构建32位二进制文​​件以及64位二进制文​​件。)

您可以使用一组简单的宏将正常名称“重定向”到这些函数。

示例输出:

C:\temp>gcc --version
gcc (tdm64-1) 4.6.1

C:\temp>gcc -m32 -std=gnu99 -o test test.c

C:\temp>test

0xa.b24dd2f1a9fcp+1
0xa.b24dd2f1a9fcp+1