2012-04-19 16 views
33

Welche Regeln gelten für das Escapezeichen \ in Zeichenfolgenliteralen? Gibt es eine Liste aller Charaktere, die geflohen sind?Regeln für C++ - Zeichenfolgenliterale Escapezeichen

Insbesondere, wenn ich \ in einem String Literal in gedit verwenden, und folgen Sie es durch drei beliebige Zahlen, es färbt sie unterschiedlich.

ich versuche, ein std::string aus einem wörtlichen mit dem Charakter 0 durch die Null-Zeichen (\0), durch das Zeichen 0 gefolgt gefolgt aufgebaut zu erstellen. Die Syntaxhervorhebung hat mich jedoch darauf aufmerksam gemacht, dass dies möglicherweise etwas wie das Zeichen 0 gefolgt von dem Nullzeichen (\00, aka \0), also nur zwei Zeichen, erzeugt.

Für die Lösung gerade dieses ein Problem, dann ist dies der beste Weg, es zu tun:

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

Und gibt es einige Referenz für das, was das Escape-Zeichen hat in Stringliterale im Allgemeinen? Was ist zum Beispiel '\ a'?

+0

Verwandte, wie [Escape-Sequenz zu entkommen] (http://stackoverflow.com/questions/8229521/how-to-escape-or-terminate-an-escape-sequence-in-c). Die beste Lösung besteht darin, die Verkettung so zu verwenden, wie Sie es getan haben. – MPelletier

+0

Wenn Sie eine einzelne '\' verwenden Sie einfach '\\' benötigen. – MPelletier

+0

Es sieht so aus, als könnte ich auch die Initialisierungslisten-Syntax verwenden: 'std :: string {'0', 0, '0'};' –

Antwort

48

Steuerzeichen:

(Hex-Codes übernehmen eine ASCII-kompatible Zeichencodierung.

)
  • \a = \x07 = alert (Glocke)
  • \b = \x08 = Backspace
  • \t = \x09 = horizonal tab
  • \n = \x0A = Neue-Zeile (oder Zeilenvorschub)
  • \v = \x0B = vertikale Registerkarte
  • \f = \x0C = Formularvorschub
  • \r = \x0D = Carriage Return
  • \e = \x1B = escape (Nicht-Standard-GCC-Erweiterung)

Interpunktionszeichen:

  • \" = quotation Markierung (Backslash nicht erforderlich für '"')
  • \' = Apostroph (Backslash nicht für "'" erforderlich)
  • \? = Fragezeichen (verwendet trigraphs zu vermeiden)

Numerische Zeichenreferenzen

  • \\ = Backslash:

    • \ + bis zu 3 oktale Ziffern
    • \x + beliebige Anzahl von Hexadezimalziffern
    • \u + 4 Hexadezimalzeichen (Unicode BMP, neu in C++ 11)
    • \U + 8 Hexadezimalziffern (Unicode Astralebenen, neu in C++ 11)

    \0 = \00 = \000 = oktal ecape für Nullzeichen

    Wenn Sie eine tatsächliche Ziffer Zeichen nach einem \0 wollen, dann ja, empfehle ich die String-Verkettung. Beachten Sie, dass der Leerraum zwischen den Teilen des Literals optional ist, sodass Sie "\0""0" schreiben können.

  • +15

    Im Fall von '\ x' werden die Hexadezimalziffern 'gierig' gelesen bis zur ersten Nicht-Hexadezimalziffer (das heißt, nicht wie erwartet auf 2 beschränkt, und wie einige Syntaxmarker * annehmen *). Sie können den @ dan04-Trick zum Aufteilen von Strings verwenden, um das Ende des Hex zu markieren: '" \ x0020 "" FeedDadBeer "' anstatt "\ x0020FeedDadBeer" '. – Rhubbarb

    +0

    Also was wird dann mit '\ x' gefolgt von einer ungeraden Anzahl von Hexits dargestellt? Man nimmt an, dass für eine gerade Zahl jedes Sechseck ein Halbbyte des Speichers von der höchsten zur niedrigsten Ordnung darstellt - somit ist "\ x5f" "01011111" und nicht "11110101"; aber bedeutet das dann, dass '\ x5' '01010000' ist und nicht' 00000101'? Und was ist mit '\ x5f5'? Ist das "01011111 01010000" oder "01011111 00000101"? – eggyal

    +1

    Ich weiß nicht, ob dies eine eigene Frage bestätigen würde, aber ich habe String-Daten von einer Quelle mit '" \ e "' darin erhalten. Ich sehe es nicht auf irgendeine Referenz aufgelistet, könnte es äquivalent zu '\ x1B' sein? –

    4

    \a ist die Glocke/Alarm-Zeichen, die auf einigen Systemen einen Ton auslöst. \nnn, steht für ein beliebiges ASCII-Zeichen in oktaler Basis. Jedoch ist \0 insofern besonders, als es das Nullzeichen darstellt, egal was passiert.

    Ihre ursprüngliche Frage zu beantworten, Sie könnten Ihre '0' Zeichen als auch zu entkommen, wie:

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

    (seit einem ASCII '0' ist 60 oktal)

    Die MSDN documentation hat ein ziemlich detaillierter Artikel darüber, auch cppreference

    +0

    In diesem Beispiel wird die Konstruktorzeichenfolge (const char * s) verwendet, die s wie eine C-Zeichenfolge behandelt. Das Beispiel von OP verwendet String (const char * s, size_t n), der es wie ein Array von Zeichen behandelt. – mgiuffrida

    +0

    @eli Perchance hast du meine Antwort gesehen, bevor ich sie bearbeitet habe? – jli

    4

    \ 0 wird als eine oktale Escape-Sequenz interpretiert, wenn es von anderen Ziffern folgt, so wird \ 00 als ein einzelnes Zeichen interpretiert werden. (\ 0 ist technisch auch eine oktale Escape-Sequenz, zumindest in C).

    Die Art und Weise Sie es tun:

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

    funktioniert, weil diese Version des Konstruktor ein Array char nimmt; Wenn Sie versuchen, einfach "0 \ 0" "0" als const char * zu übergeben, wird es als C-String behandelt und kopiert nur alles bis zum Nullzeichen.

    Hier ist ein .

    1

    verließ ich so etwas wie dies als Kommentar, aber ich fühle es wahrscheinlich mehr Sichtbarkeit, da keine der Antworten benötigt diese Methode erwähnen:

    Die Methode, die ich ein std::string mit nicht druckbare Zeichen in der Regel bevorzugen nun zur Initialisierung (und insbesondere eingebettete Nullzeichen) soll das C++ 11-Merkmal von Initialisierungslisten verwenden.

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

    Ich bin nicht erforderlich fehleranfällige manuelle Zählen der Anzahl von Zeichen auszuführen, die ich verwende, so dass, wenn später möchte ich irgendwo ein ‚\ 013‘ in der Mitte einfügen, ich kann und Der gesamte Code wird weiterhin funktionieren. Es vermeidet auch vollständig jegliche Probleme, die falsche Fluchtsequenz zufällig zu verwenden.

    Der einzige Nachteil ist all diese zusätzlichen ' und , Zeichen.

    0

    Mit der Magie der benutzerdefinierten Literale haben wir noch eine andere Lösung. C++ 14 fügte einen std::string Literaloperator hinzu.

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

    Konstruiert einen String der Länge 2 mit einem '\ 0' (Null), gefolgt von einem '0' Zeichen (die Ziffer Null). Ich bin mir nicht sicher, ob es mehr oder weniger klar ist als die initializer_list<char>constructor approach, aber es wird zumindest die ' und , Zeichen los.

    Verwandte Themen