2012-04-19 17 views
33

Quali sono le regole per il carattere di escape \ in string letterali? C'è una lista di tutti i personaggi che sono sfuggiti?Regole per caratteri letterali stringa C++ escape

In particolare, quando uso \ in una stringa letterale in gedit e lo seguo con tre numeri qualsiasi, li colora in modo diverso.

cercavo di creare una std::string costruito da un letterale con il carattere 0 seguito dal carattere nullo (\0), seguito dal carattere 0. Tuttavia, l'evidenziazione della sintassi mi ha avvisato che forse questo avrebbe creato qualcosa come il carattere 0 seguito dal carattere null (\00, alias \0), vale a dire solo due caratteri.

Per la soluzione al solo questo problema, è questo il modo migliore per farlo:

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

E c'è qualche riferimento per quanto il carattere di escape fa in stringhe letterali in generale? Cosa è '\ a', per esempio?

+0

Correlati, su come [eseguire il escape di una sequenza di escape] (http://stackoverflow.com/questions/8229521/how-to-escape-or-terminate-an-escape-sequence-in-c). La soluzione migliore è utilizzare la concatenazione come hai fatto tu. – MPelletier

+0

Se hai bisogno di un singolo '' basta usare '\\'. – MPelletier

+0

Sembra che possa anche usare la sintassi dell'elenco di inizializzazione: 'std :: string {'0', 0, '0'};' –

risposta

48

caratteri di controllo:

(codici Hex assumono una codifica dei caratteri ASCII-compatibile.)

  • \a = \x07 = avviso (campana)
  • \b = \x08 = backspace
  • \t = \x09 = scheda horizonal
  • \n = \x0A = nuova riga (o avanzamento riga)
  • \v = \x0B = scheda verticale
  • \f = \x0C = mangimi forma
  • \r = \x0D = Carriage Return
  • \e = \x1B = escape (non standard GCC estensione)

caratteri di punteggiatura:

  • \" = preventivo contrassegno (barra inversa non richiesta per '"')
  • \' = apostrofo (backslash non richiesto per "'")
  • \? = punto di domanda (utilizzato per evitare trigrammi)
  • \\ = backslash

riferimenti a caratteri numerici:

  • \ + fino a 3 cifre ottali
  • \x + qualsiasi numero di cifre esadecimali
  • \u + 4 cifre esadecimali (Unicode BMP, nuovo in C++ 11)
  • \U + 8 cifre esadecimali (Unicode piani astrali, nuovo in C++ 11)

\0 = \00 = \000 = ottale ecape per carattere null

Se si desidera un carattere effettivo cifra dopo un \0, allora sì, mi raccomando concatenazione di stringhe. Tieni presente che lo spazio bianco tra le parti del letterale è facoltativo, quindi puoi scrivere "\0""0".

+15

Nel caso di '\ x', le cifre esadecimali verranno lette 'avidamente' fino alla prima cifra non esadecimale (che non è limitata a 2 come ci si potrebbe aspettare, e come alcuni evidenziatori di sintassi * do * assumono). Puoi usare il trucco @ dan04 di dividere le stringhe per segnare la fine dell'esagono: '" \ x0020 "" FeedDadBeer "' piuttosto che '" \ x0020FeedDadBeer "'. – Rhubbarb

+0

Quindi cosa viene rappresentato da '\ x' seguito da un numero dispari di esagoni? Si presume che per un numero pari, ciascuna esadecimale rappresenta un nibble di memoria dall'ordine dal più alto al più basso, quindi '\ x5f' è' 01011111' piuttosto che '11110101'; ma ciò significa che '\ x5' è' 01010000' piuttosto che '00000101'? E allora che dire '\ x5f5'? Questo è "01011111 01010000" o "01011111 00000101"? – eggyal

+1

Non so se questo potrebbe validare una sua domanda, ma ho ricevuto dati di stringa da qualche fonte con '" \ e "' in esso. Non lo vedo elencato su alcun riferimento, potrebbe essere equivalente a '\ x1B'? –

4

\a è il carattere campanello/avviso, che su alcuni sistemi attiva un suono. \nnn, rappresenta un carattere ASCII arbitrario in base ottale. Tuttavia, \0 è speciale in quanto rappresenta il carattere null indipendentemente da cosa.

Per rispondere alla tua domanda iniziale, si potrebbe sfuggire tuoi '0' personaggi così, come:

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

(in quanto un ASCII '0' è 60 in ottale)

Il MSDN documentation ha un anche un articolo abbastanza dettagliato su questo, cppreference

+0

Quell'esempio usa la stringa del costruttore (const char * s), che considera s come una stringa C. L'esempio di OP usa string (const char * s, size_t n), che lo tratta come un array di caratteri. – mgiuffrida

+0

@eli Perchance hai visto la mia risposta prima di modificarla? – jli

4

\ 0 verrà interpretato come una sequenza di escape ottale se è seguito da altre cifre, quindi \ 00 verrà interpretato come un singolo carattere. (\ 0 è anche tecnicamente una sequenza di escape ottale, almeno in C).

Il modo in cui si sta facendo:

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

opere perché questa versione del costruttore prende un array di caratteri; se si tenta di passare "0 \ 0" "0" come const char *, lo tratterà come una stringa C e copierà tutto fino al carattere null.

Ecco uno list of escape sequences.

1

ho lasciato qualcosa di simile a questo come un commento, ma sento che probabilmente ha bisogno di maggiore visibilità, come nessuna delle risposte menziona questo metodo:

Il metodo ora preferisco per l'inizializzazione di un std::string con caratteri non stampabili in generale (e in particolare i caratteri null incorporati) usa la funzione C++ 11 degli elenchi di inizializzatori.

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

io non sono tenuto a svolgere soggetto a errori di conteggio manuale del numero di caratteri che si sta usando, in modo che se in seguito voglio inserire un '\ 013' in mezzo da qualche parte, posso e tutto il mio codice funzionerà ancora. Inoltre, ignora completamente qualsiasi problema relativo all'uso errato della sequenza di escape errata.

L'unico lato negativo sono tutti quelli in più ' e , caratteri.

0

Con la magia dei letterali definiti dall'utente, abbiamo ancora un'altra soluzione a questo. C++ 14 ha aggiunto un operatore letterale std::string.

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

crea una stringa di lunghezza 2, con un '0 \' carattere (nullo) seguito da un '0' carattere (la cifra zero). Non sono sicuro se sia più o meno chiaro rispetto allo initializer_list<char>constructor approach, ma almeno si sbarazza dei caratteri ' e ,.

Problemi correlati