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?
\045es un escape en tiempo de compilación que es parte del lenguaje y se convertirá en %cuando se compila. printfes 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, printfes 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 \na la salida y fputsno.
puts. Nunca pensé putsen 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 *% "