literal escape c++ string escaping

Reglas para literales de cadenas C++ caracteres de escape



string literal c++ (5)

¿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ó?

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

Estaba intentando crear una std::string construida a partir de un literal con el carácter 0 seguido del carácter nulo ( /0 ), seguido del carácter 0 . Sin embargo, el resaltado de sintaxis me alertó de que tal vez esto crearía algo así como el carácter 0 seguido del carácter nulo ( /00 , alias /0 ), es decir, solo dos caracteres.

Para la solución a este único problema, ¿es esta la mejor manera de hacerlo?

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

¿Y hay alguna referencia sobre qué hace el carácter de escape en los literales de cadenas en general? ¿Qué es ''/ a'', por ejemplo?


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 carácter ''/ 0'' (nulo) seguido de un carácter ''0'' (el dígito cero). No estoy seguro de si es más o menos claro que el planteamiento de constructor initializer_list<char> , pero al menos se deshace de los caracteres '' y , '' .


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

El método que ahora prefiero para inicializar una 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 un recuento manual propenso a errores del número de caracteres que estoy usando, de modo que si más adelante quiero insertar un ''/ 013'' en el medio, puedo y todo mi código funcionará. . También evita completamente cualquier problema de utilizar la secuencia de escape incorrecta por accidente.

El único inconveniente son todos esos personajes extra '' y.


/ 0 se interpretará como una secuencia de escape octal si está 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 haces:

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

funciona 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 una lista de secuencias de escape .


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

Para responder a su pregunta original, también podría escapar de sus personajes ''0'', como:

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

(dado que un ASCII ''0'' tiene 60 en octal)

La documentación de MSDN tiene un artículo bastante detallado sobre esto, así como cppreference


Caracteres de control:

(Los códigos hexadecimales suponen una codificación de caracteres compatible con ASCII).

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

Caracteres de puntuación:

  • /" = comillas (no se requiere barra invertida para ''"'' )
  • /' = apóstrofo (no se requiere barra invertida para "''" )
  • /? = signo de interrogación (utilizado para evitar los trigrafos)
  • // = barra invertida

Referencias de caracteres numéricos:

  • / + hasta 3 dígitos octales
  • /x + cualquier cantidad de dígitos hexadecimales
  • /u + 4 dígitos hexadecimales (Unicode BMP, nuevo en C ++ 11)
  • /U + 8 dígitos hexadecimales (planos astrales Unicode, nuevos en C ++ 11)

/0 = /00 = /000 = octal ecape para carácter nulo

Si desea un dígito real 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" .