const char* Vergleiche



  • Abend,

    2 kleine Fragen zu einem const char* s;

    1. Wie setze ich den am besten auf einen Nullstring. Per s = 0; oder per s = "";?
    2. Wie prüfe ich am besten s auf Nullstring? per s != "" oder s != 0 oder !strcmp(s, ""); ?



  • Erstens: Es gibt einen Unterschied zwischen Null-String (s=NULL) und leerem String (s="" bzw. *s='\0'). Je nachdem, was du erreichen willst, können beide Varianten Sinn machen.

    Zweitens: s!="" liefert meistens nicht das, was du benötigst, s!=NULL vergleicht mit dem Null-String, strcmp(s,"") oder *s!='\0' vergleicht mit dem leeren String.



  • Zudem gibt es in C++ auch std::string s. Bei denen musst du dich so etwas gar nicht mehr fragen.



  • Ich mach das mal etwas ausführlicher. Bei einem C-String gibt es zwei Möglichkeiten ihn "leer" zu setzen.

    Da es sich um einen Zeiger handelt, ist es möglich den Zeiger selber auf 0 zu setzen

    s = 0

    Es kann auch entsprechend abgefragt werden ob der Zeiger gültig ist

    s == 0

    Dann gibt es noch die Möglichkeit den Inhalt des Strings selber zu testen

    *s == 0

    C-Strings werden immer mit einer 0 beendet. Mit der Abfrage oben wird nur getestet ob das erste Zeichen den Binären Wert 0 hat (Nicht den Wert für das ZEICHEN 0 !). Das bedeutet das s auf einen C-String zeigt, dieser aber leer ist.

    Zuerst muss man immer testen ob der Zeiger selber 0 ist, sonst greift man bei *s auf undefinierten Speicher zu.

    Bei const char * s den String selber auf leer zu setzen geht garnicht, da durch das const der String (also der Inhalt) ja Konstant ist und entsprechend nicht manipuliert werden darf. s = 0 geht dagegen weil der Pointer selber nicht const ist. Diese doppelte Möglichkeit von const bei Zeigern ist sehr verwirrend.

    Ein klassischer Test auf einen Leersting sieht so aus:

    if((s==0) || (*s==0))
    {
        ...
    }
    

    Zuerst wird getestet ob der Zeiger überhaupt auf etwas zeigt, dann ob es überhaupt Zeichen enthält.

    const char * s kann man auf einen Nullstring setzen. man kann ihn auch mit s = "" auf einen Leerstring zeigen lassen, das ist aber in den meisten Fällen nicht das was man erreichen will. Da kommt es auf den konkreten Fall an.

    An besten ist aber immer noch der Tip von EOutOfResources : std::string!



  • Was ist überhaupt ein "Nullstring"?

    Es sieht mir danach aus, als ob Du (Vergleicher2) nicht wirklich verstehst, was "const char*" für ein Typ ist. Es handelt sich hierbei um einen Zeiger -- nicht um eine String-Variable, die Zeichenketten speichert, so wie zB eine int-Variable Ganzzahlen speichert.

    Wenn Dir Das Zeiger-Konzept noch zu hoch ist (aber auch sonst) würde ich Dir empfehlen, die Verwendung von std::string vorzuziehen.


Anmelden zum Antworten