Representación octal dentro de una cadena en C

3 minutos de lectura

avatar de usuario
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.

  • Supongo que tu código real tiene char *p = "\7777"; sin el 0 delante.

    – pmg

    5 de agosto de 2012 a las 9:02

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

  • este enlace le brinda más información sobre las secuencias de escape c0x.codificación-guidelines.com/6.4.4.4.html

    – rajesh6115

    5 de agosto de 2012 a las 11:46

  • entonces, ¿cuál es su pregunta? Si menciona claramente, solo puede obtener una buena respuesta.

    – rajesh6115

    5 de agosto de 2012 a las 16:13

  • para ser más precisos, los números octales deben estar en un rango de “\000” a “\377” porque se almacenará en 1 byte y después de “\377” mostrará una advertencia: secuencia de escape octal fuera de rango.

    – r.bhardwaj

    6 de agosto de 2012 a las 10:47

  • sí, las secuencias de escape octales pueden tener un máximo de “\377”, pero si proporciona “\378”, entonces “\37” es su número octal y 8 es un carácter (es decir, un máximo de 3 caracteres siempre que todos estén entre 0 y 7). ¿Tienes claro este concepto o no?

    – rajesh6115

    6 de agosto de 2012 a las 13:13


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

¿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