【问题标题】:error: unknown conversion type character 'l' in format - scanning long long错误:格式中的未知转换类型字符“l” - 扫描 long long
【发布时间】:2014-05-18 02:53:07
【问题描述】:

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

scanf("%lld", &rule);

抛出:

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

我找到了more workarounds,但它们也会抛出错误:

 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

【问题讨论】:

  • 尝试使用 -std=gnu99 之类的东西,而不是 c99。
  • 如果rule 改为int64_t,请尝试scanf("%" SCNd64, &rule); 确保包括inttypes.hstdint.hSee this 了解更多信息。 C99 应该支持它。
  • 我删除了我发布的一个答案;你正在做的事情在 Linux 上使用相同的 gcc 选项对我来说符合并执行得很好,所以我认为这与 MingW 有关。
  • 您的实现不符合 C99。您确定在生成第一条错误消息时传递了-std=c99
  • -std=gnu99 产生相同的错误。

标签: c scanf c99


【解决方案1】:

也只是想添加这个sn-p:

MinGW-w64 - for 32 and 64 bit Windows / [Mingw-w64-public] -Wformat and %llu

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

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

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

【讨论】:

    【解决方案2】:

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

    #include <inttypes.h>
    

    但所有这些都应该只在您的编译器支持 C99 时才有效。您的第一条错误消息强烈表明它没有,或者您没有提供正确的命令行开关。

    【讨论】:

    • 它没有:MinGW 尽可能多地重用 Windows 的软件组件,这包括 C 运行时。 MinGW 的 GCC 是 C99 编译器与非 C99 标准库的嵌合体。
    • 不幸的是,在包含inttypes.h 之后,我遇到了与以前相同的错误。编译器怎么可能做不了这么琐碎的事情呢?必须保留命令行开关 - 在评估服务器上使用相同的开关(我正在做编程作业)。
    • 正如 Pascal 所说,您的平台包含来自 Windows 的不符合 C99 的组件。在评估服务器上,如果这不是在 Windows 系统上,你可能会有更多的运气。
    • 尽管我们收到 lld 的警告,但我观察到打印了正确的值(MinGW。在以下情况下,打印的结果是 6442450950 unsigned long long var6=2147483650*3; printf("var6 =% lld\n",var6);
    • @rajesh,这是因为 libc 而不是编译器进行打印。 libc 按照实现所说的那样完成工作。编译器还会检查符合 的库是否能正确处理格式化字符串。
    猜你喜欢
    • 2012-08-22
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多