2009-04-16 13 views

Respuesta

2

En C, las cadenas se 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 sintaxis especial utilizada en los literales de cadena, donde la barra invertida funciona como una introducción a la secuencia de escape, y es seguida por varias cosas.

Una secuencia de este tipo es "barra diagonal inversa cero", que simplemente significa un carácter con el valor cero. Por lo tanto, se puede 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 sintaxis, podría escribir el byte cero como '\x0', por ejemplo.

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

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

También hay un conjunto de caracteres especiales "con nombre" de un carácter, como '\n' para nueva línea, '\t' para TAB, y así sucesivamente.

+0

¿Qué pasa si usted quiere escribir "Este 0has \ \ 00 caracteres"? ¿Sería \ 0 interpretado como un byte '\ 0' o como '\ 0', '0'? ¿Cuál es el límite de la longitud de una secuencia de escape octal? – strager

+0

@strager, no lo conozco pero podría usar <"this \ 0has \ 0" "0 chars"> ya que C solo los ejecutará juntos. – paxdiablo

+0

pero c solo leerá esto de <"this \ 0has \ 00 chars">, ya que obtendrá el valor nulo \ 0 que es la condición de prueba para el final de cualquier cadena. ¿a qué te refieres con "podrías escribir cero byte como '\ x0'"? gracias por la respuesta! – mawia

2

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

\ 0354 = 11 101 100

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

\ x23 = 0010 0011

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

Por lo tanto, si quieres una cadena que utiliza códigos ASCII como STX y ETX, que puede hacer:

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

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

Por ejemplo, esta compila 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 */ 

Editar: El uso de caracteres literales octales tiene una advertencia interesante. 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 */ 
Cuestiones relacionadas