Respuestas:
Puedes escapar publicando un doble '%' como este: %%
Usando tu ejemplo:
printf("hello%%");
El signo de escape '%' es solo para printf. Si lo haces:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
Imprimirá: This is a's value: %%
%
es específico printf
, ¿correcto?
\045
es un escape en tiempo de compilación que es parte del lenguaje y se convertirá en %
cuando se compila. printf
es una función de tiempo de ejecución, por lo que trata con los bytes de su cadena, no con el código fuente C, y tiene sus propias secuencias de escape que son parte de la función . En resumen, printf
es un "lenguaje dentro de un idioma", y printf("This is a's value: %s\n", a);
da el mismo resultado que printf("This is a's value: \045\0163\012", a);
.
printf("hello%c", '%');
. Sin embargo, %%
es mejor porque no usa otro argumento.
Como otros han dicho, %% escapará al%.
Tenga en cuenta, sin embargo, que nunca debe hacer esto:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Siempre que tenga que imprimir una cadena, siempre, siempre, siempre imprímala usando
printf("%s", c)
para evitar que un% incrustado cause problemas [violaciones de memoria, segfault, etc.]
Si no hay formatos en la cadena, puede usar puts
(o fputs
):
puts("hello%");
si hay un formato en la cadena:
printf("%.2f%%", 53.2);
Como se señaló en los comentarios, puts
agrega a \n
a la salida y fputs
no.
puts
. Nunca pensé puts
en imprimir cadenas y salté directamente a printf
. Ya no.
Consigo mismo ...
printf("hello%%"); /* like this */
Nitpick:
Realmente no escapas de %
la cadena que especifica el formato para el printf()
(yscanf()
) familia de funciones.
El %
, en la printf()
(y scanf()
) familia de funciones, inicia una especificación de conversión. Una de las reglas para la especificación de conversión establece que a %
como especificador de conversión (inmediatamente después del %
que inició la especificación de conversión) causa un'%'
que se escriba carácter sin argumento convertido.
La cadena realmente tiene 2 '%'
caracteres en el interior (a diferencia de los caracteres de escape: "a\bc"
es una cadena con 3 caracteres no nulos; "a%%b"
es una cadena con 4 caracteres no nulos).
La barra invertida en C se usa para escapar de caracteres en cadenas. Las cadenas no reconocerían% como un carácter especial y, por lo tanto, no sería necesario escapar. Printf es otro asunto: use %% para imprimir un%.
Puedes usar %%:
printf("100%%");
El resultado es:
100%
está utilizando un especificador de formato incorrecto que debería usar %%
para imprimir %
. Tu código debe ser:
printf("hello%%");
Simplemente puede usar %
dos veces, eso es"%%"
Ejemplo:
printf("You gave me 12.3 %% of profit");
El doble '%' también funciona en ".Format (...). Ejemplo (con iDrawApertureMask == 87, fCornerRadMask == 0.05):
csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ;
proporciona el valor deseado y esperado de (contenido de cadena en) csCurrentLine;"% ADD87C, 0.0500 *% "