Strings und die Null



  • Hallo,

    ich habe eine Verständnisfrage, was die string-Klasse angeht. Was passiert eigentlich mit der Null, wenn ich ein String mit den Memberfunktionen bearbeite, d.h. ohne dabei in andere Datentypen umzuwandeln? Wenn ich das richtig verstehe, dann wird die alte Null immer automatisch entfernt und eine neue am Ende des String angehängt, richtig? Demzufolge müsste der folgende Ausdruck immer richtig sein:

    string szRetrieved("was-auch-immer");
    szRetrieved.append("oder?");		
    LPCSTR szRetrievedBuff = szRetrieved.c_str();
    
    szRetrievedBuff [szRetrieved.length()] == '\0'	//müsste auch nach szRetrieved.replace() gelten
    

    Korrigiert mich bitte wenn ich mich irre.

    Danke.
    Rewind

    P.S. Naja, worauf ich mit der Frage hinauswollte, ist ob es nicht-nulldeterminierte Strings geben kann (halt initialisierte Objekte der String-Klasse ohne 0 am Ende)...



  • Wie genau die Strings intern arbeiten, ist nicht spezifiziert. Die können also auch den Null-Terminator wegschmeißen und sich die Länge intern notieren. Die Methode c_str() sorgt dann bei Bedarf dafür, daß der String korrekt für C-basierte Stringverarbeitung aufbereitet wird, d.h. ordentlich mit '\0' beendet ist.
    Oder in Kurzfassung: Ja (wo immer auch szSourcePath herkam)

    (Nebenbei: im Inneren eines std::string ist '\0' als ganz normales Zeichen ohne Sonderbedeutung erlaubt)



  • CStoll schrieb:

    (wo immer auch szSourcePath herkam)

    Mein Fehler 🙂
    Danke für die Antwort. Ich gehe davon aus, dass sie sich auf die obere Frage bezieht (und nicht auf das post scriptum).



  • Die Antwort bezog sich eigentlich nur auf die Urpsrungsfrage, ist aber auch auf das Post Scriptum anwendbar:

    Ja, die Bedingung str.c_str()[str.length()=='\0' wird vom Standard vorgeschrieben
    Ja, es kann std::string's geben, die nicht mit '\0' abgeschlossen sind - c_str() ist die einzige Methode der Klasse, die die Nullterminierung garantiert.


Anmelden zum Antworten