[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 demnull 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 demnull 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.