
r.bhardwaj
En el programa dado:
int main() {
char *p = "\0777";
printf("%d %d %d\n",p[0],p[1],p[2]);
printf("--%c-- --%c-- --%c--\n",p[0],p[1],p[2]);
return 0;
}
Está mostrando la salida como:
63 55 0
–?– –7– —-
Puedo entender que está convirtiendo los dos primeros caracteres después \0 (\077) de de octal a decimal pero ¿alguien puede explicarme por qué 2 caracteres, por qué no 1 o 3 o cualquier otro?
Por favor explique la lógica detrás de esto.
char *p = "\07777";
Aquí, un literal de cadena asignado a un puntero a un carácter.
"\07777"
En esta secuencia de cadena literal de escape octal se usa, por lo que los primeros tres dígitos representan un número octal. Porque las reglas para la secuencia de escape octal son —
Solo puede usar los dígitos del 0 al 7 en una secuencia de escape octal. Las secuencias de escape octales nunca pueden tener más de tres dígitos y terminan con el primer carácter que no es un dígito octal. Aunque no necesita usar los tres dígitos, debe usar al menos uno. Por ejemplo, la representación octal es \10 para el carácter de retroceso ASCII y \101 para la letra A, como se indica en un gráfico ASCII.
SO su cadena literal almacenada en la memoria como
1er byte como un número octal 077 que no es más que 63 en decimal y ‘?’ en personaje
2do y 3er byte como caracteres ‘7’ y ‘7’ respectivamente
y un carácter de terminación ‘\0’ al final.
por lo que su respuesta es la esperada 1st, 2nd, 3d byte de la cadena literal.
para obtener más explicaciones, puede visitar este sitio web
http://msdn.microsoft.com/en-us/library/edsza5ck.aspx
Es solo la forma en que el lenguaje define las secuencias de escape octales.
Una secuencia de escape octal, que puede ser parte de una constante de caracteres o un literal de cadena, consta de un \
seguido de exactamente 1, 2 o 3 dígitos octales ('0'
.. '7'
).
En "\07777"
la barra invertida va seguida de 3 dígitos octales (0, 7, 7), que representan un carácter con el valor 077
en octal, o 63
en decimal En ASCII o una codificación derivada de ASCII, resulta ser un signo de interrogación '?'
.
Entonces, el literal representa una cadena con una longitud de 3, que consta de '?'
‘7’, ‘7’.
Pero debe haber un error tipográfico en su pregunta. Cuando ejecuto su programa, el resultado que obtengo es:
63 55 55
--?-- --7-- --7--
Si cambio la declaración de p
para
char *p = "\0777";
Obtengo el resultado que describes. Tenga en cuenta que la final ----
es realmente dos guiones, seguidos de un carácter nulo, seguido de dos guiones. Si está en un sistema similar a Unix, intente canalizar la salida del programa a través de cat -v
o cat -A
.
Cuando publica código, es muy importante copiarlo y pegarlo, no volver a escribirlo.
(Y te estás perdiendo el #include <stdio.h>
en la cima.)
Supongo que tu código real tiene
char *p = "\7777";
sin el 0 delante.– pmg
5 de agosto de 2012 a las 9:02