我在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
非常感谢帮助。
答案 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