String vs Array



  • Hallo erstmal 😃

    Muss für meine anstehende Klausur wissen ob ich das richtig verstanden habe.

    Ein string besteht aus mehreren char. Er ist fast identisch mit einem char Array, aber stellt eine eigene Klasse da. Die größe des Strings wird nicht festgelegt.

    Ist das so richtig und gibt es noch andere grundlegende und wichtige Unterschiede?

    lg
    Klotz



  • Klotz schrieb:

    Ein string besteht aus mehreren char. Er ist fast identisch mit einem char Array, aber stellt eine eigene Klasse da. Die größe des Strings wird nicht festgelegt.

    std::string ? Was soll "fast identisch mit einem char Array" bedeuten? ein Array aus N char s ist ein zusammenhängender Speicherbereich aus N Bytes. Ein std::string ist eine klasse, die irgendwie😉 eine Zeichenkette repräsentiert und Memberfunktionen zum Umgang mit diesen Daten bereitstellt.

    ~*) Ja, der Standard spezifiziert das genauer ...~



  • [quote="Swordfish"]

    Klotz schrieb:

    Was soll "fast identisch mit einem char Array" bedeuten?

    using namespace std;

    string str = "Text";

    char str[4] = {'T', 'e', 'x', 't' };

    führt doch zum selben Resultat?



  • Klotz schrieb:

    Muss für meine anstehende Klausur

    Welcher Schultyp?



  • Klotz schrieb:

    using namespace std;
    
    string str = "Text";
    
    char str[4] = {'T', 'e', 'x', 't' };
    

    führt doch zum selben Resultat?

    Nope. Das eine ist ein std::string der selbst seine Länge kennt und auch so lieb ist, dir die Länge per std::string::length() mitzuteilen, seinen Speicher selbst (dynamisch) verwaltet und bei bedarf wächst.
    Das andere ist ein Array aus 4 char s dessen Elemente 'T' , 'e' , 'x' , und 't' sind. Eine Funktion, die einen üblichen C-String (Nullterminiert) erwartet könnte damit genau garnichts anfangen.



  • heiho schrieb:

    Klotz schrieb:

    Muss für meine anstehende Klausur

    Welcher Schultyp?

    FH, Informatik für EIT. Habe Informatik nur ein Semester, deshalb wird auf viele Details nicht so eingegangen.



  • Swordfish schrieb:

    Klotz schrieb:

    [cpp]using namespace std;

    string str = "Text";

    char str[4] = {'T', 'e', 'x', 't' };

    führt doch zum selben Resultat?

    Nope. Das eine ist ein std::string der selbst seine Länge kennt und auch so lieb ist, dir die Länge per std::string::length() mitzuteilen, seinen Speicher selbst (dynamisch) verwaltet und bei bedarf wächst.
    Das andere ist ein Array aus 4 char s dessen Elemente 'T' , 'e' , 'x' , und 't' sind. Eine Funktion, die einen üblichen C-String (Nullterminiert) erwartet könnte damit genau garnichts anfangen.

    Vielen Dank, dass hilft mir beim Verständnis sehr weiter 🙂



  • Klotz schrieb:

    Vielen Dank, dass hilft mir beim Verständnis sehr weiter 🙂

    Glaub' ich nicht. Was ist der Unterschied zwischen

    char str[4] = {'T', 'e', 'x', 't' };
    
    // und
    
    char str[] = "Text";
    

    ?



  • Swordfish schrieb:

    Klotz schrieb:

    Vielen Dank, dass hilft mir beim Verständnis sehr weiter 🙂

    Glaub' ich nicht. Was ist der Unterschied zwischen

    char str[4] = {'T', 'e', 'x', 't' };
    
    // und
    
    char str[] = "Text";
    

    ?

    Gut das sind ja jetzt auch die Arrays 😉

    Glaub ist nur eine unterschiedliche Deklaration. Array besteht ja aus Feldern - die Anzahl der Felder muss mann doch beim Erzeugen des Arrays mit angeben. Das letztere ist auch erlaubt? Noch nie wirklich vorher gesehen 🙄



  • Klotz schrieb:

    Glaub ist nur eine unterschiedliche Deklaration. Array besteht ja aus Feldern - die Anzahl der Felder muss mann doch beim Erzeugen des Arrays mit angeben.

    Ja. Entweder explizit in den eckigen Klammern oder implizit durch die Anzahl der angegebenen Initializers.

    Klotz schrieb:

    Das letztere ist auch erlaubt? Noch nie wirklich vorher gesehen 🙄

    Ja. Aber das interessante ist, das str im zweiten Fall fünf Elemente hat, weil "Text" ein C-String (Nullterminierung!) ist und als { 'T', 'e', 'x', 't', '\0' } interpretiert wird. Somit kann man auch die Länge herausfinden, wie lang das Ding ist, wenn man nur einen Pointer auf das erste Element hat (google: array to pointer decay). Bei deiner Version ist das unmöglich.


Anmelden zum Antworten