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