在编译以下代码时:

#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,基本上忽略格式字符串中的空格和I,并遵循%n格式.

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

(另外,对于那些了解上下文的人来说:我知道所讨论的系统没有使用C,我只是好奇printf在这里做什么).

推荐答案

I标志是printf的GNU扩展.从man page人中:

glibc 2.2又增加了一个标志字符.

I

对于十进制整数转换(idu),输出使用

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

C++相关问答推荐

以c格式打印时间戳

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

如何正确地索引C中的 struct 指针数组?

C:scanf(%d&q;,...)输入只有一个减号

C由四个8位整数组成无符号32位整数

Win32API Wizzard97 PropSheet_SetWizButton不工作

将常量转换为指针会增加.数据大小增加1000字节

Kdb:仅升级指定的列

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

接受任何参数的函数指针是否与接受不同参数的函数兼容

如何在C-函数中混合使用C代码和ASM?

如何在C++中安全地进行浮点运算

为什么电路板被循环删除?

在下面的C程序中,.Ap0是如何解释的?

可以';t从A9G模块拨打电话

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

如何使用 VLA 语法使用 const 指针声明函数

使用邻接表创建图

为什么实现文件中的自由函数默认没有内部链接?

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?