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

4 minutos de lectura

avatar de usuario
cris_45

¿Cómo escapas del signo% cuando usas printf ¿Cª?

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

  • "hello\%" no funciona porque produce la cadena hello% más NUL como "hello%" hace.

    – ikegami

    17 de febrero de 2021 a las 5:53

  • "hello\%" no funciona porque… para mí… no compila. Usé Microsoft Visual Studio 2017. La compilación falla con el mensaje: '%': unrecognized character escape sequence.

    – Djibril NDIAYE

    12 abr 2021 a las 16:46

avatar de usuario
pablo santa cruz

Puede evitarlo publicando un doble ‘%’ como este: %%

Usando tu ejemplo:

printf("hello%%");

Escapar del signo ‘%’ es solo para imprimir. Si lo haces:

char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);

Imprimirá: This is a's value: %%

  • “printf(“hola%%”);” es correcto. Pero no es un escape, creo. use printf(“hola\045”);

    – Lai Jiangshan

    11 de diciembre de 2009 a las 3:12

  • @Pablo Santa Cruz: este método para “escapar” % es específico para printf¿correcto?

    – Lazer

    27 de marzo de 2010 a las 12:20

  • Este es un caso especial de la regla muy común en los sistemas de escape de que para obtener un símbolo de escape literal se usa .

    – dmckee — gatito ex-moderador

    1 de julio de 2010 a las 14:49

  • Lai Jiangshan, esto no funcionará. \045 es un escape en tiempo de compilación que es parte del idioma y se convertirá en % cuando se compila. printf es una función de tiempo de ejecución, por lo que se ocupa de los bytes de su cadena, no del código fuente de C, y tiene sus propias secuencias de escape que forman parte de la función. En breve, printf es un “lenguaje dentro de un lenguaje”, 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

    7 mayo 2013 a las 14:23


  • Además, puedes hacer esto: printf("hello%c", '%');. Sin embargo, %% es mejor porque no usa otro argumento.

    – Triang3l

    7 mayo 2013 a las 14:28


avatar de usuario
mikeage

Como han dicho otros, %% escapará del %.

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, fallas de segmentaciónetc.).

  • La advertencia generalmente es 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.

    7 de diciembre de 2009 a las 14:17

  • Una vez se me ocurrió una solución alternativa: copie el búfer en otro búfer y luego revíselo duplicando los signos %. Eventualmente encontré esta idea y reemplacé una función de 20-30 líneas con una línea. No te preocupes, me golpeé severamente en la cabeza, como me lo merecía.

    –Graeme Perrow

    7 de diciembre de 2009 a las 14:19

  • Es mucho más fácil hacer puts( c ). Si

    – William Pursell

    7 de diciembre de 2009 a las 14:48

  • pone agrega una nueva línea. Eso es a menudo un comportamiento no deseado.

    – Mikeage

    8 de diciembre de 2009 a las 10:51

  • @Mikeage: si no lo desea, hágalo fputs(string, stdout); o printf("%s", string);

    – Jonas Kolker

    02/11/2015 a las 15:00

avatar de usuario
Sinan Ünür

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 indica en los comentarios, puts agrega un \n a la salida y fputs no es.

  • Vale la pena mencionar fputs() también, ya que corresponde directamente a fprintf().

    – Tim Publicar

    8 de diciembre de 2009 a las 5:55

  • puts también agrega una nueva línea [even if you already have one]. Si quieres eso, genial. De lo contrario…

    – Mikeage

    8 de diciembre de 2009 a las 10:51

  • @Sinan Ünür: gracias por recordarme puts. nunca pensé en puts para imprimir cadenas y saltó directamente a printf. Ya no.

    – Lazer

    24 de marzo de 2010 a las 17:03

consigo mismo…

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

quisquilloso:
Realmente no escapas de la % en la cadena que especifica el formato para el printf() (y scanf()) familia de funciones.

Él %en el 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 un % como especificador de conversión (inmediatamente después del % que inició la especificación de conversión) provoca un '%' carácter que se va a escribir sin ningún argumento convertido.

La cuerda De Verdad tiene 2 '%' caracteres internos (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).

  • técnicamente, todavía está “escapando”; los personajes que son especiales necesitan una forma de “escapar” de su significado especial y volver a su “naturaleza de carácter”

    – ShinTakezou

    1 de julio de 2010 a las 8:29

avatar de usuario
Pedro Mortensen

Utilizar una doble %%:

printf("hello%%");

  • técnicamente, todavía está “escapando”; los personajes que son especiales necesitan una forma de “escapar” de su significado especial y volver a su “naturaleza de carácter”

    – ShinTakezou

    1 de julio de 2010 a las 8:29

avatar de usuario
salman a

Me gusta esto:

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad