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

24

我正在尝试使用标准输入输出函数 scanf 从控制台获取 long long。我从 %lld 开始:

scanf("%lld", &rule);

那会抛出:

error: unknown conversion type character 'l' in format [-Werror=format=]

我已经找到了更多解决方法,但它们也会抛出错误:

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

我是否做错了什么?还有其他的窍门吗?

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


如果ruleint64_t类型,那么请尝试使用scanf("%" SCNd64, &rule);进行输入。请确保包含了inttypes.hstdint.h头文件。更多信息请参考这里。该方法应该在C99中被支持。 - WhozCraig
我删除了我发布的一个答案;使用相同的gcc选项在Linux上,您所做的内容对我来说是符合和执行良好的,因此我认为这可能与MingW有关。 - James King
你的实现不符合C99标准。你确定在生成第一个错误消息时已经传递了-std=c99参数吗? - M.M
这并不是第一次编译在Windows和Linux上的结果差别很大了。 - Tomáš Zato
2
-std=gnu99 产生相同的错误。 - Tomáš Zato
显示剩余2条评论
2个回答

13

我想再添加一点:

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

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

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

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


6

对于 SCNd64 等类似的内容,您需要使用

#include <inttypes.h>

但是所有这些仅在您的编译器支持C99时才能正常工作。您收到的第一个错误信息强烈表明它不支持,或者您没有提供正确的命令行开关。


4
MinGW尽可能地重用Windows中的许多软件组件,包括C运行时库。MinGW的GCC是一个混合了C99编译器和非C99标准库的怪物。 - Pascal Cuoq
不幸的是,包含了 inttypes.h 后,我仍然得到与之前相同的错误。编译器怎么可能无法做这么简单的事情呢?命令行开关必须保持不变 - 在评估服务器上使用的是相同的开关(我正在做编程作业)。 - Tomáš Zato
正如Pascal所说,您的平台包含了不符合C99标准的Windows组件。在评估服务器上,如果不是在Windows系统上运行,您可能会有更好的运气。 - Jens Gustedt
尽管我们收到了lld的警告,但我观察到正确的值被打印出来了(MinGW)。在下面的情况中,打印的结果是6442450950。unsigned long long var6=2147483650*3; printf("var6 =%lld\n",var6); - Rajesh
1
@rajesh,这是因为libc而不是编译器进行打印输出。libc按照其实现方式执行操作。编译器还会检查是否符合<standard>标准的库能正确处理格式化字符串。 - PypeBros
我认为这些问题/特性使得C语言更容易出现错误。 - Rajesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接