Nun, hier ist mein erster Beitrag. Ich habe versucht, diese Auswahl zu treffen, und ich möchte, dass der Benutzer nur Zahlen auswählt, anstatt sie einzutippen (einfacher), aber wenn ich möchte, dass die Zahlen einer Zeichenfolge entsprechen, heißt es “Array-Typ char[30] ist nicht zuweisbar”. Auch wenn ich hinten Semikolon setze oder nicht.
#include <stdio.h>
int main() {
int choice1;
char word[30];
printf("You have three choice.\n");
printf("[1] Jump [2] Run [3] Dance\n");
scanf("%d",&choice1);
if (choice1 == 1)
{
word = "Jump" //Error #1
}
else if (choice1 == 2)
{
word = "Eat" //Error #2
}
else if (choice1 == 3)
{
word = "Sleep"; //Error #3
}
printf("You will now be %sing",word);
}
wenn Sie zuweisen möchten word ohne strcpy du kannst das schaffen word getippt wie const char *word.
– Leroy
31. August 2015 um 14:06 Uhr
Überraschenderweise erhalten Sie den Fehler, weil der Array-Typ char[] ist nicht zuordenbar. In C können Sie Strings nicht so zuweisen, weil es keinen eingebauten String-Typ gibt, sondern nur rohe Zeichen-Arrays. Wie auch immer, das ist so eine FAQ … bitte findet jemand ein Duplikat.
Eine Bibliotheksfunktion von Drittanbietern wie strcpy vorzuschlagen, ohne anzugeben, wo/welche externe Bibliothek heruntergeladen und installiert werden muss, um darauf zuzugreifen, ist das Gegenteil von Zukunftssicherheit.
– David Bandel
26. Oktober 2021 um 5:09 Uhr
@DavidBandel strcpy ist eine Standard-C-Funktion. Es ist definitiv kein “Drittanbieter”.
– Irgendein Programmierer-Typ
26. Oktober 2021 um 6:21 Uhr
fügen Sie diese Zeile hinzu, um strcpy #include zu verwenden
– Anees
7. November 2021 um 16:23 Uhr
Sourav Ghosh
TL;DR Antwort: Ein Array Name ist nicht ein modifizierbarer lvalue. Sie können also den Zuweisungsoperator (=) auf diesem.
Um den Inhalt in das Array zu kopieren, müssen Sie verwenden strcpy() aus string.h (char Array) oder memcpy() Im Algemeinen.
Nun zur näheren Erläuterung eigentlicher Grund hinter der Fehlermeldung, Anführungszeichen C11Kapitel §6.5.16, Assignment operators
Der Zuweisungsoperator muss einen modifizierbaren lvalue als linken Operanden haben.
und dann unter Berufung auf Kapitel §6.3.2.1 derselben Norm,
EIN änderbarer lvalue ist ein Lvalue, der keinen Array-Typ hat, [….]
Ein Array-Name ist also nicht a änderbarer lvalue daher können Sie nicht zuordnen irgendwas dazu. Das ist der Grund für die Fehlermeldung.
Aber ich frage mich, warum die C-Spezifikation so definiert ist? Scheint vernünftig, von einem Array zu einem anderen zuweisen zu wollen …
– Nielsbot
4. Februar 2016 um 22:44 Uhr
@nielsbot Ich kann mir zwei verwandte Gründe vorstellen – 1) es gibt keine Operatorüberladung in C 2) Array-Namen, die in den meisten Fällen auf den Zeiger auf das erste Element zerfallen (auch wenn sie als Operand des Zuweisungsoperators verwendet werden) – also gibt es keine direkte Möglichkeit, den Inhalt zu kopieren. Die Adresse kann höchstens verwendet werden – aber das ist nicht der Anwendungsfall, den wir hier suchen.
– Sourav Ghosh
7. Oktober 2020 um 6:29 Uhr
Das = -Operator kann nicht zum Kopieren von verwendet werden Inhalt von einem Array zum anderen; Sie müssen eine Bibliotheksfunktion wie verwenden strcpy oder strcat für Saiten, memcpy für Nicht-Strings (oder Array-Elemente einzeln zuweisen).
Dies ist eine Folge davon, wie C Arrays behandelt Ausdrücke. Ein Array-Ausdruck ist durch den Sprachstandard als a definiert nicht änderbarer lvalue; Es ist ein lvalue, weil es sich auf ein Objekt im Speicher bezieht, aber es darf nicht das Ziel einer Zuweisung sein.
Die Array-Index-Operation a[i] ist definiert als *(a + i); das heißt, angesichts des Arrays die Anschriftaversetzt i Elemente von dieser Adresse und dereferenzieren Sie das Ergebnis. Da der Array-Ausdruck a wird als Hinweis behandelt, denken die meisten Leute a Variable Shops ein Zeiger auf das erste Element des Arrays, aber das tut es nicht. Alles, was gespeichert wird, sind die Array-Elemente selbst.
Stattdessen wird immer dann, wenn der Compiler einen Array-Ausdruck in einer Anweisung sieht, it konvertiert dieser Ausdruck vom Typ “N-Element-Array von T” bis “Zeiger auf T“, und der Wert des Ausdrucks wird zur Adresse des ersten Elements des Arrays (es sei denn, der Ausdruck ist der Operand der sizeof oder unär & Operatoren oder ist ein Zeichenfolgenliteral, das verwendet wird, um ein anderes Array in einer Deklaration zu initialisieren).
Und deshalb ein Array-Ausdruck wie word kann nicht das Ziel einer Zuweisung sein; es gibt nichts zuzuweisen zu. Es gibt kein Objekt word das existiert unabhängig von word[0], word[1]etc.
Wenn du schreibst
word = "Jump";
die Art des Ausdrucks "Jump" wird von “5-element array of char” bis “Zeiger auf char“, und der Wert des Ausdrucks ist die Adresse des ersten Elements des Arrays. Und Sie versuchen, das zuzuweisen Zeiger Wert zu einem Reihe Objekt, das a) kein Zeiger ist und b) sowieso nicht zugewiesen werden kann.
ameyCU
Verwenden strcpy aus <string.h>–
strcpy(word,"Jump");
Und ähnlich für den Rest von ihnen.
Du kannst einfach nicht word ="Jump". Da der Inhalt modifizierbar ist, wird die Arrays selbst sind es nicht.
14080500cookie-checkArray-Typ char[] ist nicht zuordenbar [duplicate]yes
wenn Sie zuweisen möchten
word
ohnestrcpy
du kannst das schaffenword
getippt wieconst char *word
.– Leroy
31. August 2015 um 14:06 Uhr
Überraschenderweise erhalten Sie den Fehler, weil der Array-Typ char[] ist nicht zuordenbar. In C können Sie Strings nicht so zuweisen, weil es keinen eingebauten String-Typ gibt, sondern nur rohe Zeichen-Arrays. Wie auch immer, das ist so eine FAQ … bitte findet jemand ein Duplikat.
– Ludin
31. August 2015 um 14:59 Uhr
Die akzeptierte Antwort im “Duplikat” ist keine Antwort (meta.stackexchange.com/questions/225370/…), nur ein Link zu einer schrecklichen FAQ.
– Elise van Looij
27. Juni 2018 um 14:53 Uhr