Zeichenketten Zeichenfolgen zuweisen
Ich bin ein wenig überrascht von der folgenden.
Beispiel 1:
char s[100] = "abcd"; //declare and initialize - WORKS
Beispiel 2:
char s[100]; //declare
s = "hello"; //initalize - DOESN'T WORK ('lvalue required' error)
Frage ich mich, warum der zweite Ansatz nicht funktioniert. Es scheint natürlich, dass es sollte (es funktioniert auch mit anderen Datentypen)? Könnte jemand erklären Sie mir die Logik hinter diesem?
InformationsquelleAutor der Frage Ree | 2009-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim initialisieren ein array, C ermöglicht das füllen mit Werten. so
ist im Grunde das gleiche wie
aber es nicht erlauben, Sie zu tun, die assignmend da s ist ein array und kein freier Zeiger. die Bedeutung von
ist zum zuweisen der Zeiger den Wert "abcd" , 's', aber Sie können nicht ändern, s da dann nichts auf die Reihe.
Dies kann und funktioniert, wenn die s ist ein
char*
- einen Zeiger, der auf nichts.wenn Sie möchten, kopieren Sie die Zeichenkette einfach verwenden strcpy
InformationsquelleAutor der Antwort shoosh
Gibt es keine solche Sache wie ein "string" in C-Strings sind arrays von char, abgeschlossen durch
NULL
durch Konvention. Da kann man nicht zuweisen von arrays in C, Sie kann nicht zuordnen strings. Das literal "hello" ist syntaktischer Zucker fürconst char x[] = {'h','e','l','l','o','\0'};
Der korrekte Weg wäre:
oder noch besser:
InformationsquelleAutor der Antwort dwc
Initialisierung und Zuweisung sind zwei unterschiedliche Vorgänge zu verwenden, die denselben operator ("=") hier.
InformationsquelleAutor der Antwort Sparr
Im Beispiel ist vorausgesetzt, s ist tatsächlich initialisiert in Zeile 1, nicht Zeile 2. Obwohl Sie nicht zuordnen es explizit ein Wert an diesem Punkt, der compiler hat. Bei der Linie 2, die Sie gerade ausführen ein Zuweisungsoperator, und Sie können nicht zuweisen, ein array von Zeichen, ein array von Zeichen wie diese. Sie haben die Verwendung von strcpy() oder irgendeine Art von Schleife zum zuweisen jedes element des Arrays.
InformationsquelleAutor der Antwort Matt Davis
Erweitern Sparr Antwort
Betrachten Sie es wie folgt:
Vorstellen, dass es 2 Funktionen, genannt
InitializeObject
, undAssignObject
. Wenn der compiler siehtthing = value
sieht es auf den Kontext und fordert eineInitializeObject
wenn Sie eine neuething
. Wenn nicht, ist es stattdessen fordertAssignObject
.Normalerweise ist dies in Ordnung, so wie
InitializeObject
undAssignObject
in der Regel die gleiche Weise Verhalten. Außer beim Umgang mit char-arrays (und ein paar andere Sonderfälle), in dem Fall Verhalten Sie sich unterschiedlich. Warum tun Sie dies? Nun, das ist eine ganz andere post mit dem stack vs heap und so weiter und so Fort.PS: nebenbei bemerkt, daran zu denken, auf diese Weise wird auch helfen zu verstehen, copy Konstruktoren und andere solche Dinge, wenn Sie jemals Wagen, in C++
InformationsquelleAutor der Antwort Orion Edwards
Beachten Sie, dass können Sie noch tun:
InformationsquelleAutor der Antwort aib
Diese:
Wo
yylval ist char*. strdup aus der job nicht.
InformationsquelleAutor der Antwort Yekatandilburg
Was ich verwenden würde, ist
InformationsquelleAutor der Antwort Vivek