web-dev-qa-db-de.com

Der Arraytyp char [] kann nicht zugewiesen werden

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 einzugeben (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 ein Semikolon habe 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);

}
18
SkytheCoder

Sie können nicht zuweisen einem Array zuweisen, sondern nur kopieren.

Verwenden Sie stattdessen strcpy wie

strcpy(Word, "Jump");
20

TL; DR Antwort: Ein Array Name ist nicht ein änderbarer Wert. Daher können Sie den Zuweisungsoperator (=) Nicht dafür verwenden.

Um den Inhalt in das Array zu kopieren, müssen Sie strcpy() from string.h (char array) oder memcpy() im Allgemeinen.


Um nun den tatsächlichen Grund hinter der Fehlermeldung zu erläutern, zitieren Sie C11, Kapitel §6.5.16, Assignment operators.

der Zuweisungsoperator hat einen veränderbaren Wert als linken Operanden.

und zitieren dann Kapitel §6.3.2.1 aus dem gleichen Standard,

Ein modifizierbarer Wert ist ein Wert ohne Array-Typ, [....]

Ein Arrayname ist also kein änderbarer Wert , daher können Sie ihm nichts zuweisen . Dies ist der Grund für die Fehlermeldung.

10
Sourav Ghosh

Der Operator = Kann nicht zum Kopieren des Contents eines Arrays in das andere verwendet werden. Sie müssen eine Bibliotheksfunktion wie strcpy oder strcat für Zeichenfolgen oder memcpy für Nichtzeichenfolgen verwenden (oder Array-Elemente einzeln zuweisen).

Dies ist eine Folge davon, wie C Array Ausdrücke behandelt. Ein Array-Ausdruck wird vom Sprachstandard als nicht modifizierbarer Wert definiert. Dies ist ein Wert, da er sich auf ein Objekt im Speicher bezieht, aber möglicherweise nicht das Ziel einer Zuweisung ist.

Die Array-Indexoperation a[i] Ist definiert als *(a + i); das heißt, wenn das Array addressa gegeben ist, werden i Elemente von dieser Adresse versetzt und das Ergebnis dereferenziert. Da der Array-Ausdruck a als Zeiger behandelt wird, denken die meisten Leute, dass a variable stores ein Zeiger auf das erste Element des Arrays ist, dies ist jedoch nicht der Fall. Alles, was gespeichert wird, sind die Array-Elemente selbst.

Wenn der Compiler stattdessen einen Array-Ausdruck in einer Anweisung sieht, konvertiert diesen Ausdruck vom Typ "N-Element-Array von T" zu "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 Operatoren sizeof oder unary & oder es handelt sich um ein Zeichenfolgenliteral, das verwendet wird ein anderes Array in einer Deklaration initialisieren).

Aus diesem Grund kann ein Array-Ausdruck wie Word nicht das Ziel einer Zuweisung sein. Es gibt nichts zuzuweisen z. Es gibt kein Objekt Word, das unabhängig von Word[0], Word[1] Usw. existiert.

Wenn du schreibst

Word = "Jump";

der Typ des Ausdrucks "Jump" wird von "5-Element-Array von char" in "Zeiger auf char" konvertiert, und der Wert des Ausdrucks ist die Adresse von erstes Element des Arrays. Und Sie versuchen, diesen Zeiger Wert einem Array Objekt zuzuweisen, dem a) kein Zeiger ist und dem b) ohnehin nicht zugewiesen werden kann.

7
John Bode

Verwenden Sie stcpy von <string.h>-

 strcpy(Word,"Jump");

Und für den Rest ähnlich.

Sie können Word ="Jump" einfach nicht tun. Da der Inhalt modifizierbar ist, sind die Arrays selbst nicht.

1
ameyCU