escape - ¿Por qué no se escapa el carácter de porcentaje con la barra invertida en C?
escape sequence java (4)
El compilador procesa la barra diagonal inversa cuando interpreta el texto fuente del programa. Entonces, el resultado común es que el texto de origen "/%"
produce una cadena que contiene "%".
La cadena de formato es interpretada por la rutina printf
, por lo que procesa los caracteres que se le pasan. En este momento, la barra invertida ya no está presente, por lo que printf
nunca la ve.
Técnicamente, /%
no es legal en una cadena literal. El carácter /
inicia una secuencia de escape, y las únicas secuencias de escape legales se enumeran en C 2011 6.4.4.4 1. Son seguidas de ''
, "
, ?
, /
, A, b
, f
, n
, r
, t
, v
, de uno a tres dígitos octales, x
y dígitos hexadecimales, u
y cuatro dígitos hexadecimales, o U
y ocho dígitos hexadecimales.
Si printf
hubiera sido diseñado de modo que una barra diagonal inversa se escapara a un porcentaje, entonces tendría que pasar una barra diagonal inversa escapando la barra diagonal inversa en el texto de origen, por lo que tendría que escribir:
printf("//%");
La documentación de printf()
dice que si alguien quiere imprimir %
en C, puede usar:
printf("%%")
¿Por qué no?
printf("/%")
¿Como con otros personajes especiales?
La convención es que los personajes especiales se escapan a sí mismos. Entonces, en lugar de usar barra invertida para escapar del porcentaje, se escapa a sí mismo. (Tenga en cuenta que para pasar una barra invertida a printf
, tendría que escribir el literal de cadena como "//%"
.)
Porque el %
es manejado por printf
. No es un carácter especial en C, pero printf
lo trata de manera diferente.
Puedes hacerlo !!!!!
#include <iostream>
#include <string>
#include "stdio.h"
using namespace std;
int main(int argc, char **argv)
{
printf("hhhhhhh %s /n","/%");
printf("hhhhhhh /n");
return 0;
}
El problema existe con printf y difiere del compilador que usa. Con wxWidget lib no puede usar printf con dos secuencias de escape
printf(" xxxxxx /0x81 xx /0x82 xx /n");
no te vayas Pero si usas
printf(" xxxxxx %s xx %s /n","/0x81","/0x82");
tienes razón. Un plus