Regras para literais de string C ++ escapam de caractere

Quais são as regras para o caractere de escape \ em literais de string? Existe uma lista de todos os caracteres que são escapados?

Em particular, quando eu uso \ em um literal de string em gedit, e segui-lo por quaisquer três números, ele os colore diferentemente.

Eu estava tentando criar um std::string construído a partir de um literal com o caractere 0 seguido pelo caractere nulo ( \0 ), seguido pelo caractere 0 . No entanto, o destaque da syntax me alertou que talvez isso criaria algo como o caractere 0 seguido pelo caractere nulo ( \00 , aka \0 ), o que significa apenas dois caracteres.

Para a solução desse problema, essa é a melhor maneira de fazer isso:

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

E há alguma referência para o que o caractere de escape faz em literais de string em geral? O que é ‘\ a’, por exemplo?

Caracteres de controle:

(Os códigos hexadecimais assumem uma codificação de caracteres compatível com ASCII.)

  • \a = \x07 = alerta (sino)
  • \b = \x08 = retrocesso
  • \t = \x09 = guia horizontal
  • \n = \x0A = newline (ou feed de linha)
  • \v = \x0B = guia vertical
  • \f = \x0C = feed de formulário
  • \r = \x0D = retorno de carro
  • \e = \x1B = escape (extensão do GCC não padrão)

Caracteres de pontuação:

  • \" = aspas (não é necessário barra invertida para '"' )
  • \' = apóstrofo (barra invertida não é necessária para "'" )
  • \? = ponto de interrogação (usado para evitar trigramas)
  • \\ = barra invertida

Referências de caracteres numéricos:

  • \ + até 3 dígitos octal
  • \x + qualquer número de dígitos hexadecimais
  • \u + 4 dígitos hexadecimais (Unicode BMP, novo em C ++ 11)
  • \U + 8 dígitos hexadecimais (planos astrais Unicode, novos em C ++ 11)

\0 = \00 = \000 = octal ecape para caractere nulo

Se você quiser um caractere de dígito real depois de um \0 , então sim, eu recomendo concatenação de string. Note que o espaço em branco entre as partes do literal é opcional, então você pode escrever "\0""0" .

\ 0 será interpretado como uma seqüência de escape octal se for seguido por outros dígitos, então \ 00 será interpretado como um único caractere. (\ 0 é tecnicamente uma seqüência de escape octal também, pelo menos em C).

O jeito que você está fazendo isso:

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

funciona porque esta versão do construtor usa uma matriz char; Se você tentar apenas passar “0 \ 0” “0” como um const char *, ele irá tratá-lo como uma string C e copiar tudo até o caractere nulo.

Aqui está uma lista de seqüências de escape .

\a é o caractere sino / alerta, que em alguns sistemas aciona um som. \nnn representa um caractere ASCII arbitrário na base octal. No entanto, \0 é especial, pois representa o caractere nulo, não importa o quê.

Para responder à sua pergunta original, você também pode escaping dos seus caracteres “0”, como:

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

(desde que um ASCII ‘0’ seja 60 em octal)

A documentação do MSDN tem um artigo bem detalhado sobre isso, assim como a cppreference

Deixei algo assim como um comentário, mas acho que provavelmente precisa de mais visibilidade, já que nenhuma das respostas menciona esse método:

O método que eu agora prefiro para inicializar um std::string com std::string não imprimíveis em geral (e caracteres nulos incorporados em particular) é usar o recurso C ++ 11 de listas de inicializadores.

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

Eu não sou obrigado a realizar contagem manual propensa a erros do número de caracteres que estou usando, para que se mais tarde eu quiser inserir um ‘\ 013’ no meio em algum lugar, eu posso e todo o meu código ainda funcionará . Ele também evita completamente qualquer problema de usar a seqüência de escape errada por acidente.

A única desvantagem é todos os caracteres extras e ' .

Com a mágica dos literais definidos pelo usuário, temos outra solução para isso. C ++ 14 adicionou um operador literal std::string .

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

Constrói uma cadeia de comprimento 2, com um caractere ‘\ 0’ (nulo) seguido por um caractere ‘0’ (o dígito zero). Não tenho certeza se é mais ou menos claro do que a abordagem do construtor initializer_list , mas pelo menos se livra dos caracteres ' e ' .