C printf 中的 'I'(大写 i)标志是什么?

What is the 'I' (capital i) flag in C printf?

编译以下代码时:

#include <stdio.h>
int main() {
  printf("99% Invisible");
  return 0;
}

在 gcc 7.5.0 中,我收到以下警告:

test.c: In function ‘main’:
test.c:4:16: warning: ' ' flag used with ‘%n’ gnu_printf format [-Wformat=]
   printf("99% Invisible");
                ^
test.c:4:16: warning: 'I' flag used with ‘%n’ gnu_printf format [-Wformat=]
test.c:4:16: warning: format ‘%n’ expects a matching ‘int *’ argument [-Wformat=]
   printf("99% Invisible");
             ~~~^

这是怎么回事?我在文档中的任何地方都没有看到提及“”标志或“I”标志。代码输出 99visible,基本上忽略格式字符串中的 space 和 I,并遵循 %n 格式。

编辑:人们似乎误解了这个问题。我知道如何打印文字 %,以及 %n 做什么。我只是好奇这里发生了什么。

(另外,对于那些了解上下文的人:我知道有问题的系统没有使用 C,我只是想知道 printf 在这里做了什么)。

要打印文字 %,您必须编写 %%

https://en.cppreference.com/w/c/io/fprintf

I 标志不在 C 标准中。

I 标志是 printf 的 GNU 扩展。来自 man page:

glibc 2.2 adds one further flag character.

I

For decimal integer conversion (i, d, u) the output uses the locale's alternative output digits, if any. For example, since glibc 2.2.3 this will give Arabic-Indic digits in the Persian ("fa_IR") locale.

因此,当编译器检查格式字符串时,它会将 % In 视为格式说明符,即 space 和 I 标志应用于 n 转换说明符.由于这两个标志均不适用于 n 转换说明符,因此编译器会针对每个标志发出警告。

您的编译器似乎在 printf 格式字符串中遇到 % 字符时,它会向前扫描以找到有效的格式说明符,然后将所有内容 in-between 解释为修饰符。如果这些修饰符无效,则会标记错误。

正如其他人指出的那样,将 "99% Invisible" 替换为 "99%% Invisible" 以解决问题。