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 “type de tableau char[30] n’est pas assignable “. Même si à l’arrière je mets le point-virgule ou pas.

 #include  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); } 

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

Utilisez plutôt strcpy , comme

 strcpy(word, "Jump"); 

TL; DR answer: Un nom de tableau n’est pas une lvalue modifiable. Donc, vous ne pouvez pas utiliser l’opérateur d’affectation ( = ) pour cela.

Pour copier le contenu dans le tableau, vous devez utiliser strcpy() partir de ssortingng.h (tableau de caractères) ou memcpy() en général.


Maintenant, pour élaborer la raison réelle du message d’erreur, citons 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 une lvalue modifiable , vous ne pouvez donc rien y affecter . C’est la raison derrière le message d’erreur.

L’opérateur = ne peut pas être utilisé pour copier le contenu d’un tableau dans un 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 les expressions de tableau. Le langage standard définit une expression de tableau comme étant une valeur lvalue non modifiable ; c’est une valeur parce qu’elle fait référence à un object 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 par *(a + i) ; c’est-à-dire, étant donné l’ adresse de tableau a , décaler i éléments 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 a 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 cette expression du type “tableau de N-éléments de T ” en “pointeur sur T ” et la valeur de l’expression devient l’adresse du premier élément du tableau. (sauf si l’expression est l’opérande des opérateurs sizeof ou unary & , ou un littéral de chaîne utilisé pour initialiser un autre tableau dans une déclaration).

Et c’est pourquoi une expression de type tableau, telle que word ne peut pas être la cible d’une affectation; il n’y a rien à assigner à . Il n’y a pas de word object existant indépendamment du word[0] , du word[1] , etc.

Quand tu écris

 word = "Jump"; 

le type de l’expression "Jump" est converti de “tableau de 5 éléments” en “pointeur vers caractère” et la valeur de l’expression est l’adresse du premier élément du tableau. Et vous essayez d’affecter cette valeur de pointeur à un object de tableau , ce qui a) n’est pas un pointeur et b) ne peut pas être affecté de toute façon.

Utilisez stcpy de

  strcpy(word,"Jump"); 

Et semblable pour le rest d’entre eux.

Vous ne pouvez pas faire word ="Jump" . Comme les contenus sont modifiables, les tableaux eux-mêmes ne le sont pas.