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