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

问题描述 投票:13回答:2

我正在尝试使用标准IO功能long long从控制台获取scanf。我从%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

c scanf c99
2个回答
5
投票

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

#include <inttypes.h>

但是如果您的编译器支持C99,那么所有这些都应该可行。您的第一条错误消息强烈表明它没有,或者您没有给出正确的命令行开关。


1
投票

只是想添加这个片段:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.