Array-Typ char[] ist nicht zuordenbar [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von SkytheCoder
SkytheCoder

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.

    – 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


Du kannst nicht zuordnen nur zu einem Array Kopieren dazu.

Verwenden strcpy stattdessen wie

strcpy(word, "Jump");

  • 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


Benutzeravatar von Sourav Ghosh
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 Anschrift aversetzt 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.

Benutzeravatar von ameyCU
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.

1408050cookie-checkArray-Typ char[] ist nicht zuordenbar [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy