3

我在 Windows 中使用带有 mingw 的 gcc 4.6.1。

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

出于某种原因,我可以用这种方式打印一个浮点数,但我无法扫描它。

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

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

我已经尝试了所有我能想到的浮动和双打的变化。我尝试添加 flag -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

帮助将不胜感激。

4

1 回答 1

3

MinGWmsvcrt.dll用于其 C 运行时支持的主要部分。 msvcrt.dll通常不支持 C99 功能。

有一些 MinGW 版本提供自己对 C99 I/O 说明符的支持,但我没有收集到关于哪些版本支持 C99 功能的确切信息。

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

更新:看起来MinGW 的 TDM-64 发行版(版本 4.6.1)支持具有前缀名称的函数系列中的 C99 说明符,scanf()例如:

__mingw_sscanf()
__mingw_scanf()

可能是在 4.6.1 之后的版本中改进了支持(看起来至少在 4.6.1 版中这些功能不在 TDM 发行版的 32 位版本中 - 请记住,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
于 2013-01-23T07:17:51.937 回答