错误:格式中未知的转换类型字符'l' - 扫描很长

Tom*_*ica 16 c scanf c99

我正试图long long从控制台使用标准IO功能scanf.我开始时%lld:

scanf("%lld", &rule);
Run Code Online (Sandbox Code Playgroud)

抛出:

error: unknown conversion type character 'l' in format [-Werror=format=]
Run Code Online (Sandbox Code Playgroud)

我发现了更多变通方法,但它们也会抛出错误:

 scanf("%I64d", &rule);
   ->error: ISO C does not support the 'I64' ms_scanf length modifier [-Werror=format=]
 scanf("%"SCNd64"", &rule);
   ->error: expected ')' before 'SCNd64'
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?还有另外一招吗?

我正在使用这些标志编译最新版本的MinGw GCC: -pedantic -Wall -Werror -std=c99 -g -D HOME=1

sdb*_*bbs 8

也只是想添加这个片段:

MinGW-w64 - 适用于 32 位和 64 位 Windows / [Mingw-w64-public] -Wformat 和 %llu

问题是所有 msvcrt-DLL 版本都不支持格式化程序宽度说明符 %ll,因此 gcc 警告它的使用。以向后兼容的方式在格式化程序中为 msvcrt 指定 64 位整数标量宽度的变体是使用 %I64。

在 Windows 上使用 %I64u,或者只使用 inttypes.h PRIuMAX。

如果必须使用 %llu,请在包含 stdio.h 之前定义 __USE_MINGW_ANSI_STDIO 宏。请注意,如果您这样做,MS 类型 %I64* 格式将不再有效。


Jen*_*edt 6

对于SCNd64和类似的,你必须使用

#include <inttypes.h>
Run Code Online (Sandbox Code Playgroud)

但是,只有在您的编译器支持C99的情况下,所有这些操作才应该起作用。您的第一个错误消息是一个强烈的信号,表明没有,或者没有提供正确的命令行开关。

  • 事实并非如此:MinGW会尽可能多地重用Windows中的软件组件,其中包括C运行时。MinGW的GCC是具有非C99标准库的C99编译器的嵌合体。 (4认同)