2012-04-19 32 views
33

¿Cuáles son las reglas para el carácter de escape \ en literales de cadena? ¿Hay una lista de todos los personajes que se escapó?Reglas para literales de cadenas C++ carácter de escape

En particular, cuando uso \ en una cadena literal en gedit, y lo sigo por tres números, los colorea de forma diferente.

yo estaba tratando de crear un std::string construido a partir de un literal con el carácter 0 seguido por el carácter nulo (\0), seguido por el carácter 0. Sin embargo, el resaltado de sintaxis me alertó de que tal vez crearía algo así como el personaje 0 seguido del carácter nulo (\00, también conocido como \0), lo que significa que solo tiene dos caracteres.

Para que la solución sólo este problema, es ésta la mejor manera de hacerlo:

std::string ("0\0" "0", 3) // String concatenation 

¿Y hay alguna referencia a lo que el carácter de escape hace en los literales de cadena en general? ¿Qué es '\ a', por ejemplo?

+0

Relacionado, sobre cómo [escapar de una secuencia de escape] (http://stackoverflow.com/questions/8229521/how-to-escape-or-terminate-an-escape-sequence-in-c). La mejor solución es usar la concatenación como lo hizo. – MPelletier

+0

Si necesita un solo '\' solo use '\\'. – MPelletier

+0

Parece que también puedo usar la sintaxis de la lista de inicializadores: 'std :: string {'0', 0, '0'};' –

Respuesta

48

caracteres de control:

(códigos Hex asumen un carácter de codificación compatible con ASCII.)

  • \a = \x07 = alerta (campana)
  • \b = \x08 = retroceso
  • \t = \x09 = pestaña horizonal
  • \n = \x0A = nueva línea (o de avance de línea)
  • \v = \x0B = pestaña vertical
  • \f = \x0C = forma de alimentación
  • \r = \x0D = retorno de carro
  • \e = \x1B = Escape (extensión GCC no estándar)

caracteres de puntuación:

  • \" = cita marca (la barra invertida no es necesaria para '"')
  • \' = apóstrofe (barra invertida no es necesario para "'")
  • \? = signo de interrogación (utilizada para evitar trigrafos)
  • \\ = barra invertida

referencias numéricas de caracteres:

  • \ + hasta 3 dígitos octales
  • \x + cualquier número de dígitos hexadecimales
  • \u + 4 dígitos hexadecimales (Unicode BMP, nuevo en 11 C++)
  • \U + 8 dígitos hexadecimales (planos astrales Unicode, de nuevo en C++ 11)

\0 = \00 = \000 = octal ecape de carácter nulo

Si desea un carácter real dígitos después de un \0, entonces sí, recomiendo la concatenación de cadenas. Tenga en cuenta que el espacio en blanco entre las partes del literal es opcional, por lo que puede escribir "\0""0".

+15

En el caso de '\ x', los dígitos hexadecimales se leerán 'codiciosamente' hasta el primer dígito no hexadecimal (es decir, no limitado a 2 como cabría esperar, y como algunos marcadores de sintaxis * do * suponen). Puede usar el truco @ dan04 de dividir cadenas para marcar el final del hex: '" \ x0020 "" FeedDadBeer "' en lugar de '" \ x0020FeedDadBeer "'. – Rhubbarb

+0

Entonces, ¿qué se representa por '\ x' seguido de un número impar de hexits? Se supone que para un número par, cada hexit representa un mordisco de memoria del orden más alto al más bajo, por lo tanto '\ x5f' es' 01011111' en lugar de '11110101'; pero ¿significa eso '\ x5' es' 01010000' en lugar de '00000101'? Y entonces, ¿qué pasa con '\ x5f5'? ¿Es eso '01011111 01010000' o' 01011111 00000101'? – eggyal

+1

No sé si esto validaría una pregunta por sí mismo, pero he recibido datos de cadena de alguna fuente con '" \ e "' en ella. No lo veo en ninguna referencia, ¿podría ser equivalente a '\ x1B'? –

4

\a es el carácter de campana/alerta, que en algunos sistemas dispara un sonido. \nnn, representa un carácter ASCII arbitrario en la base octal. Sin embargo, \0 es especial ya que representa el carácter nulo sin importar qué.

Para responder a su pregunta original, se pueden escapar '0' caracteres, así, como:

std::string ("\060\000\060", 3); 

(desde un archivo ASCII '0' es 60 en octal)

El MSDN documentation tiene una artículo bastante detallado sobre esto, así como cppreference

+0

Ese ejemplo usa la cadena del constructor (const char * s), que trata a s como una cadena en C. El ejemplo de OP utiliza una cadena (const char * s, size_t n), que lo trata como una matriz de caracteres. – mgiuffrida

+0

@eli Perchance ¿vio mi respuesta antes de editarla? – jli

4

\ 0 se interpretará como una secuencia de escape octal si es seguida por otros dígitos, por lo que \ 00 se interpretará como un solo carácter. (\ 0 es técnicamente una secuencia de escape octal también, al menos en C).

La forma en que lo está haciendo:

std::string ("0\0" "0", 3) // String concatenation 

obras porque esta versión del constructor toma una matriz de caracteres; si intenta pasar "0 \ 0" "0" como const char *, lo tratará como una cadena C y solo copiará todo hasta el carácter nulo.

Aquí hay un list of escape sequences.

1

me dejó algo así como un comentario, pero creo que probablemente necesita más visibilidad ya que ninguna de las respuestas menciona este método:

El método ahora prefiero para inicializar un std::string con caracteres no imprimibles en general (y los caracteres nulos incorporados en particular) es usar la característica C++ 11 de las listas de inicializadores.

std::string const str({'\0', '6', '\a', 'H', '\t'}); 

no estoy obligado a realizar propenso a errores recuento manual del número de caracteres que estoy usando, por lo que si más adelante quiero insertar un '\ 013' en el medio en alguna parte, yo puedo y todo mi código seguirá funcionando. También evita completamente cualquier problema de utilizar la secuencia de escape incorrecta por accidente.

El único inconveniente es todos esos caracteres extra ' y ,.

0

Con la magia de los literales definidos por el usuario, tenemos otra solución a esto. C++ 14 agregó un operador literal std::string.

using namespace std::string_literals; 
auto const x = "\0" "0"s; 

Construye una cadena de longitud 2, con un '0 \' carácter (null) seguido de un '0' (el dígito cero). No estoy seguro de si es más o menos claro que el initializer_list<char>constructor approach, pero al menos se deshace de los caracteres ' y ,.

Cuestiones relacionadas