web-dev-qa-db-fra.com

Le type de tableau char [] n'est pas assignable

Eh bien voici mon premier post. J'ai essayé de faire ce choix en choisissant et je veux que l'utilisateur choisisse uniquement des nombres au lieu de les taper (plus facilement), mais lorsque je veux que les nombres soient égaux à une chaîne, le message "Le type de tableau char[30] n'est pas assignable". Même si à l'arrière je mets le point-virgule ou pas.

#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

Vous ne pouvez pas assigner à un tableau, seulement copier.

Utilisez strcpy à la place, comme

strcpy(Word, "Jump");
20

TL; DR réponse: Un tableau nom est pas une lvalue modifiable. Donc, vous ne pouvez pas utiliser l'opérateur d'assignation (=) pour cela.

Pour copier le contenu dans le tableau, vous devez utiliser strcpy() from string.h (tableau char) ou memcpy() en général.


Maintenant, pour élaborer le raison réelle derrière le message d'erreur, en citant C11, chapitre §6.5.16, Assignment operators

l'opérateur d'affectation doit avoir une valeur modifiable comme opérande gauche.

et ensuite, citant le chapitre §6.3.2.1 du même standard, 

Une lvalue modifiable est une lvalue qui n'a pas de type tableau, [....]

Ainsi, un nom de tableau n'est pas un lvalue modifiable par conséquent, vous ne pouvez pas attribuer rien à ce nom. C'est la raison derrière le message d'erreur.

9
Sourav Ghosh

L'opérateur = ne peut pas être utilisé pour copier le contenu d'un tableau sur l'autre. vous devez utiliser une fonction de bibliothèque telle que strcpy ou strcat pour les chaînes, memcpy pour les non-chaînes (ou affecter des éléments de tableau individuellement). 

Ceci est une conséquence de la façon dont C traite le tableau expressions _. Le langage standard définit une expression de tableau comme étant une lvalue non modifiable; c'est une valeur parce qu'elle fait référence à un objet en mémoire, mais ce n'est peut-être pas la cible d'une affectation. 

L'opération d'indice de tableau a[i] est définie comme suit: *(a + i); c'est-à-dire, étant donné le tableau adressea, décaler i éléments à partir de cette adresse et déréférencer le résultat. Puisque l'expression de tableau a est traitée comme un pointeur, la plupart des gens pensent que la variable a est une variable stocke un pointeur sur le premier élément du tableau, mais ce n'est pas le cas. Tout ce qui est stocké sont les éléments de tableau eux-mêmes. 

Au lieu de cela, chaque fois que le compilateur voit une expression de tableau dans une instruction, il convertit convertit cette expression du type "tableau à N éléments de T" en "pointeur sur T", et la valeur de l'expression devient l'adresse de le premier élément du tableau (sauf si l'expression est l'opérande des opérateurs sizeof ou unaire &, ou un littéral de chaîne utilisé pour initialiser un autre tableau dans une déclaration). 

Et c’est pourquoi une expression de tableau telle que Word ne peut pas être la cible d’une affectation; il n'y a rien à assigner à. Il n'y a pas d'objet Word qui existe indépendamment de Word[0], Word[1], etc. 

Quand tu écris

Word = "Jump";

le type de l'expression "Jump" est converti de "tableau à 5 éléments de char" en "pointeur sur char", et la valeur de l'expression est l'adresse du premier élément du tableau. Et vous essayez d'assigner cette valeur pointeur à un objet tableau, qui a) n'est pas un pointeur et b) ne peut pas être affecté de toute façon. 

7
John Bode

Utilisez stcpy à partir de <string.h>-

 strcpy(Word,"Jump");

Et semblable pour le reste d'entre eux.

Vous ne pouvez tout simplement pas faire Word ="Jump". Comme le contenu est modifiable, les tableaux eux-mêmes ne le sont pas.

1
ameyCU