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