constante de caracteres: \ 000 \ xhh

¿Puede alguien explicar el uso de la constante de caracteres \ 000 y \ xhh, es decir, números octales y números hexadecimales en una constante de caracteres?

En C, las cadenas terminan con un carácter con el valor cero (0). Esto podría escribirse así:

char zero = 0; 

pero esto no funciona dentro de las cadenas. Hay una syntax especial utilizada en los literales de cadena, donde la barra invertida funciona como una introducción de secuencia de escape y es seguida por varias cosas.

Una de esas secuencias es “barra invertida cero”, que simplemente significa un carácter con el valor cero. Por lo tanto, puedes escribir cosas como esta:

 char hard[] = "this\0has embedded\0zero\0characters"; 

Otra secuencia utiliza una barra invertida seguida de la letra 'x' y uno o dos dígitos hexadecimales, para representar el carácter con el código indicado. Usando esta syntax, podría escribir el byte cero como '\x0' por ejemplo.

EDIT : Al releer la pregunta, también hay soporte para tales constantes en la base ocho, es decir, octal. Usan una barra invertida seguida del dígito cero, al igual que las constantes enteras literales octales. '\00' es por lo tanto un sinónimo de '\0' .

Esto a veces es útil cuando necesita construir una cadena que contenga caracteres no imprimibles o caracteres de control especiales.

También hay un conjunto de caracteres especiales “nombrados” de un carácter, como '\n' para nueva línea, '\t' para TAB, etc.

Se usarían para escribir caracteres que no se pueden imprimir en el editor. Para caracteres estándar, que serían los diversos caracteres de control, para wchar podrían ser caracteres no representados en la fuente del editor.

Por ejemplo, esto se comstack en Visual Studio 2005:

  const wchar_t bom = L'\xfffe'; /* Unicode byte-order marker */ const wchar_t hamza = L'\x0621'; /* Arabic Letter Hamza */ const char start_of_text = '\002'; /* Start-of-text */ const char end_of_text = '\003'; /* End-of-text */ 

Edición: El uso de literales de caracteres octales tiene una advertencia interesante. Al parecer, los números octales no pueden tener más de tres dígitos, lo que restringe artificialmente los caracteres que podemos ingresar.

Por ejemplo:

  /* Letter schwa; capital unicode code point 0x018f (octal 0617) * small unicode code point 0x0259 (octal 1131) */ const wchar_t Schwa2 = L'\x18f'; /* capital letter Schwa, correct */ const wchar_t Schwa1 = L'\617'; /* capital letter Schwa, correct */ const wchar_t schwa1 = L'\x259'; /* small letter schwa, correct */ const wchar_t schwa2 = L'\1131'; /* letter K (octal 113), incorrect */ 

Octal es la base 8 (usando los dígitos 0-7), por lo que cada dígito es de 3 bits:

\ 0354 = 11 101 100

Hexadecimal es la base 16 (usando los dígitos 0-9, AF) y cada dígito es de 4 bits:

\ x23 = 0010 0011

Dentro de las cadenas C (arrays de caracteres / punteros), generalmente se utilizan para codificar bytes que no se pueden representar fácilmente.

Entonces, si quieres una cadena que usa códigos ASCII como STX y ETX, puedes hacer:

 char *msg = "\x02Here's my message\x03";