Was ist in C ein Leerstring?



  • Hallo,

    ich habe eine Variable char* s und will diese mit dem Leerstring initialisieren.
    Wie geht das in C?

    char* s = NULL; // So?
    char* s = ""; // So?
    // Anders?
    

    Danke



  • Ein Leerstring enthält keine Zeichen.
    Also "".
    Der enthält zwar das '\0', aber strlen() liefert dafür 0.

    Mit dem Leerstring kannst du aber nicht viel anfangen, da es ein Stringliteral ist.
    Versuche nicht das zu verändern.



  • wenn du einen leeren String haben willst schreibst du einfach const char* leerstring="";

    Komm aber nicht auf die Idee das später ändern zu wollen (leerstring="irgendein text" schreiben endet böse), wie es zum Beispiel in Java oder C# möglich ist, wo Strings Klassen sind die sich intern um das Speichermanagement kümmern.

    Ich hab die vermutung dass du später noch den Text ändern willst.
    Das geht auch. Entweder über einen char buffer[TEXTLÄNGE] oder über dynamischen Speicher char* dynamisch=malloc(sizeof(char)*TEXTLÄNGE), und später mittels free(dynamisch) freigeben.
    Aber selbst dann kannst du nicht einfach buffer="Text" schreiben, sondern musst den Text mittels strcpy() reinkopieren.



  • c string schrieb:

    Komm aber nicht auf die Idee das später ändern zu wollen (leerstring="irgendein text" schreiben endet böse)

    Quatsch!



  • Belli schrieb:

    c string schrieb:

    Komm aber nicht auf die Idee das später ändern zu wollen (leerstring="irgendein text" schreiben endet böse)

    Quatsch!

    Jepp. Da hat einer seinen K&R nicht verstanden.



  • Warum sollte das Quatsch sein?

    Er würde dann in einen nicht definierten Speicherbereich schreiben.
    Was wiederum in nicht definierten Verhalten enden kann?

    Oder weiss ich etwas nicht was Ihr wissen tut? Oder umgekehrt 🙂 ?

    Ich meine wenn ich Falsch liege berichtigt mich, weil ich kenne es nicht anders als wie ich es im 1. und 2. Satz geschildert habe!

    ??

    mfg. Patrick



  • Patrick_C64 schrieb:

    Oder weiss ich etwas nicht was Ihr wissen tut?

    Ja. Insbesondere hast du Pointer und Stringliterale nicht verstanden.

    int main(void)
    {
      const char *p = "Hallo, ";
      printf("%s", p);
      p = "Welt!";
      printf("%s", p);
      return 0;
    }
    

    Das ist kein Problem. Wo schreibst du denn da jemals in ein Stringliteral?



  • Eigentlich wird es einem sofort klar wenn man sich den Assembler-Output mal
    ansieht (so man das lesen kann).



  • Ein Satz wie, "lies dich mal in Stringliterale ein", hätte es auch getan.



  • cooky451 schrieb:

    Patrick_C64 schrieb:

    Oder weiss ich etwas nicht was Ihr wissen tut?

    Ja. Insbesondere hast du Pointer und Stringliterale nicht verstanden.

    int main(void)
    {
      const char *p = "Hallo, ";
      printf("%s", p);
      p = "Welt!";
      printf("%s", p);
      return 0;
    }
    

    Das ist kein Problem. Wo schreibst du denn da jemals in ein Stringliteral?

    So richtig schlüssig ist das aber auch nicht, einen char * als const zu definieren und später zu beschreiben, oder?

    Lies das nicht als implizite Kritik, sondern als Frage!

    Ich kannte das bisher so:

    char *p  = "string literal";
    p[0] = 'S';
    

    undefined, weil p auf das Stringliteral "string literal" zeigt.

    char a[] = "string literal";
    a[0] = 'S';
    

    okay, weil "string literal" nur das Stringliteral ist, das den Initialwert und die Länge des char-Arrays bestimmt.

    Bitte korrigieren, wenn falsch 🙂



  • h0rst schrieb:

    cooky451 schrieb:

    Patrick_C64 schrieb:

    Oder weiss ich etwas nicht was Ihr wissen tut?

    Ja. Insbesondere hast du Pointer und Stringliterale nicht verstanden.

    int main(void)
    {
      const char *p = "Hallo, ";
      printf("%s", p);
      p = "Welt!";
      printf("%s", p);
      return 0;
    }
    

    Das ist kein Problem. Wo schreibst du denn da jemals in ein Stringliteral?

    So richtig schlüssig ist das aber auch nicht, einen char * als const zu definieren und später zu beschreiben, oder?

    Natürlich nicht! Aber das passiert ja auch gar nicht in dem obigen Beispiel! Es wird einfach nur der Zeiger p auf ein anderes Literal 'umgebogen' - völlig problemlos.



  • Ich hab noch nie verstanden, wo Leute da ihre Probleme haben. Das ist doch sowas von simpel und logisch? 🙄



  • 314159265358979 schrieb:

    Ich hab noch nie verstanden, wo Leute da ihre Probleme haben. Das ist doch sowas von simpel und logisch? 🙄

    Es ist halt zu einfach ... 😉



  • h0rst schrieb:

    So richtig schlüssig ist das aber auch nicht, einen char * als const zu definieren und später zu beschreiben, oder?

    Bei const char *p ist das char konstant und nicht der *.
    Bei char * const p ist der * konstant, aber char nicht.
    Und bei const char * const p ... genau, beides konstant (declare p as const pointer to const char)



  • vielen dank, für die Informationen.


Anmelden zum Antworten