Al compilar el siguiente código:
#include <stdio.h> int main() { printf("99% Invisible"); return 0; }en gcc 7.5.0 recibo las siguientes advertencias:
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"); ~~~^ ¿Que esta pasando aqui? No veo mención de una bandera " " o una bandera "I" en ninguna parte de la documentación. El código genera 99visible , esencialmente ignorando el espacio y I en la cadena de formato y siguiendo el formato %n.
editar: la gente parece estar malinterpretando la pregunta. Sé cómo imprimir un % literal y qué hace %n . Sólo tengo curiosidad por lo que está pasando aquí.
(también, para aquellos que conocen el contexto: sé que el sistema en cuestión no usó C, solo tengo curiosidad por saber qué está haciendo printf aquí).
La bandera I es una extensión GNU para printf . De la página del manual:
glibc 2.2 añade un carácter indicador más.
IPara la conversión de enteros decimales (
i,d,u), la salida utiliza los dígitos de salida alternativos de la configuración regional, si los hay. Por ejemplo, desde glibc 2.2.3, esto dará dígitos árabes-índicos en la configuración regional persa ("fa_IR").
Entonces, cuando el compilador verifica la cadena de formato, ve % In como un especificador de formato, es decir, los indicadores de espacio e I aplicados al especificador de conversión n . Dado que ninguno de los indicadores es aplicable al especificador de conversión n , el compilador emite una advertencia para cada uno.
Para imprimir el literal % , debe escribir %% .
https://en.cppreference.com/w/c/io/fprintf
I flag no está en el estándar C.
Parece que con su compilador cuando se encuentra un carácter % en una cadena de formato printf , escanea hacia adelante para encontrar un especificador de formato válido, luego interpreta todo lo que se encuentra en el medio como un modificador. Si esos modificadores no son válidos, se marca un error.
Como han señalado otros, reemplace "99% Invisible" con "99%% Invisible" para solucionar el problema.