¿Cómo escapar del signo% (porcentaje) en printf de C?


274

¿Cómo escapas del signo% cuando lo usas printfen C?

printf("hello\%"); /* not like this */

Respuestas:


421

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: %%


8
"printf (" hola %% ");" es correcto. Pero no es un escape, creo. use printf ("hola \ 045");
— Lai Jiangshan

1
@Pablo Santa Cruz: este método para "escapar" %es específico printf, ¿correcto?
— Lazer

10
Este es un caso especial de la regla muy común en los sistemas de escape que para obtener un símbolo de escape literal se usa <símbolo de escape> <símbolo de escape>.
— dmckee --- ex-gatito moderador

12
Lai Jiangshan, esto no funcionará. \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);.
— Triang3l

55
Además, se puede hacer esto: printf("hello%c", '%');. Sin embargo, %%es mejor porque no usa otro argumento.
— Triang3l

36

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.]


La advertencia es generalmente apropiada, sin embargo, puede haber situaciones en las que desee hacer "esto", siempre que sepa que la cadena que proporcione se interpretará como una cadena de formato.
— PP.

2
Se me ocurrió una solución alternativa una vez: copie el búfer en otro búfer y luego repítalo doblando los signos de%. Finalmente encontré esta idea y reemplacé una función de línea 20-30 con una línea. No te preocupes, me golpeé severamente por la cabeza, como me lo merecía.
— Graeme Perrow, el

Es cierto, pero no olvide que el 99% del tiempo cuando obtiene una cadena de formato, obtiene los argumentos como va_list, por lo que debe usar vprintf. Por lo tanto, soy técnicamente correcto;)
— Mikeage

2
Es mucho más fácil hacer put (c). Si
— William Pursell

1
pone agrega una nueva línea. Ese es a menudo un comportamiento no deseado.
— Mikeage

33

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.


44
Vale la pena mencionar fputs () también, ya que corresponde directamente a fprintf ().
— Tim Post

1
put también agrega una nueva línea [incluso si ya tiene una]. Si quieres eso, genial. De lo contrario ...
— Mikeage

@Sinan Ünür: gracias por recordármelo puts. Nunca pensé putsen imprimir cadenas y salté directamente a printf. Ya no.
— Lazer


7

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).


2
técnicamente, todavía está "escapando"; los personajes especiales necesitan una manera de "escapar" de su significado especial y volver a su "naturaleza de personaje"
— ShinTakezou


4

Me gusta esto:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together

3

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%.




2

Sí, use printf ("hola %%"); Y ya está hecho.


2

Simplemente puede usar %dos veces, eso es"%%"

Ejemplo:

printf("You gave me 12.3 %% of profit");

1

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 *% "

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.