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"
以解决问题。
编译以下代码时:
#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"
以解决问题。