[gelöst] AnfängerProbleme mit Strings



  • Hallo allerseits,
    Ich musste gerade feststellen, dass ich in C mit Strings immer noch nicht recht hantieren kann.

    Wo liegt im Folgenden der Fehler?

    char s[100];
    s = "test";
    

    Ich bekomme folgende Fehlermeldung:

    error: incompatible types in assignment



  • Du kannst das ganze auf zwei Arten machen:

    char s[100];
    strcpy(s, "test");
    

    Dein Problem ist, dass ein C-String ein Array mit chars ist, dass mit dem Null-Charakter beendet wird. Arrays können aber nicht mit dem "="-Operator zugewiesen werden, sondern du musst Elementweise kopieren.

    char s[100] = "test";
    

    Hierbei wird nichts kopiert, da der String zur Initialisierung der Variable verwendet wird.

    Edit: s.u.



  • Inkompatibel sind die Typen weil "test" ein char[5] array ist und desshalb inkompatibel zu char[100] ist.

    Initialisierung eines char arrays mit einem Literal:

    char s[100] = "test";
    

    Wenn Du zuerst s anlegen möchtest und s im nachhinein füllen, musst Du z.B. strcpy oder ähnlich benutzen.

    Ansonsten empfehle ich std::string aus dem Header <string> zu verwenden.

    Grüsse Simon

    Edit: war zu langsam.. 🙂
    Edit2: vergiss den std::string. der ist aus C++.



  • alles klar, vielen Dank für die raschen Antworten! 🙂



  • simon.gysi schrieb:

    Inkompatibel sind die Typen weil "test" ein char[5] array ist und desshalb inkompatibel zu char[100] ist.

    Die Erklärung ist nicht richtig. Der Fehler würde auch bei char s[5]; kommen.

    ProgChild schrieb:

    Dein Problem ist, dass ein C-String ein Array mit chars ist, dass mit NULL beendet wird.

    Nicht NULL , sondern dem null character (einem Byte mit allen Bits zu 0 gesetzt).

    ProgChild schrieb:

    Hierbei wird nichts kopiert, da der String zur Initialisierung der Variable verwendet wird.

    Wobei die Initialisierung ja auch eine (versteckte) Kopieraktion ist.



  • Tim schrieb:

    Nicht NULL , sondern dem null character (einem Byte mit allen Bits zu 0 gesetzt).

    Ja stimmt. Mit NULL bezeichnet man normalerweise einen Pointer auf 0. Richtig wäre NUL.

    Tim schrieb:

    Wobei die Initialisierung ja auch eine (versteckte) Kopieraktion ist.

    Ja, aber nicht im Sinne, was C unter einer Zuweisung versteht, wie die Werte auf den Stack kommen ist ja nicht spezifiziert.



  • ProgChild schrieb:

    Ja, aber nicht im Sinne, was C unter einer Zuweisung versteht...

    ist im grunde genommen das selbe. zuweisungen von einer struct zur anderen benutzen z.b. auch 'memcpy' oder sowas.
    🙂



  • zuweisungs-freak schrieb:

    ist im grunde genommen das selbe. zuweisungen von einer struct zur anderen benutzen z.b. auch 'memcpy' oder sowas.
    🙂

    Nicht wirklich. Die werte könnten ja auch mit mehreren push -Befehlen hintereinander auf den Stack geschrieben werden. Da wäre die Werte ja schon im Befehl selber enthalten.

    Ist aber auch egal, denn für C ist eine Initialisierung nicht das Selbe, wie eine Zuweisung. Wie das intern umgesetzt wird ist vollkommen irrelevant, bzgl. des obigen Problems.



  • ProgChild schrieb:

    Nicht wirklich. Die werte könnten ja auch mit mehreren push -Befehlen hintereinander auf den Stack geschrieben werden. Da wäre die Werte ja schon im Befehl selber enthalten.

    oft sind's keine einzelnen push-befehle, sondern erstmal wird für alle lokalen variablem platz gemacht, indem der stack pointer erhöht wird. initialisierung von grösseren blöcken und zuweisungen an structs übernimmt dann 'ne memcpy-ähnliche funktion.
    🙂



  • lowlevel-freak schrieb:

    oft sind's keine einzelnen push-befehle

    ProgChild schrieb:

    Die werte könnten

    Was genau hat das jetzt mit dem Thema zu tun?



  • ProgChild schrieb:

    Was genau hat das jetzt mit dem Thema zu tun?

    nichts. das thema ist sowieso durch.
    🙂


Log in to reply