¿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 */
Chris_45
fuente

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

Pablo Santa Cruz
fuente
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.]

Mikeage
fuente
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.

Sinan Ünür
fuente
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
10

Consigo mismo ...

printf("hello%%"); /* like this */
Martin Clayton
fuente
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).

pmg
fuente
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
6

usar un doble %%

jldupont
fuente
4

Me gusta esto:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
Salman A
fuente
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%.

Ralph M. Rickenbach
fuente
3

Puedes usar %%:

printf("100%%");

El resultado es:

100%

Pato Donald
fuente
2

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

Kevin
fuente
2

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

Ejemplo:

printf("You gave me 12.3 %% of profit");
MD Shahriar
fuente
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 *% "

dindea
fuente