Variable de chaîne dans une condition if

J’ai utilisé ce programme pour prendre mm comme mois de l’année et imprimer le nom du mois:

#include  #include  int main(){ int mm; printf("input month "); scanf("%d", &mm); char mname[9]; if (mm == 1) {mname = "January";} if (mm == 2) {mname = "February";} if (mm == 3) {mname = "March";} if (mm == 4) {mname = "April";} if (mm == 5) {mname = "May";} if (mm == 6) {mname = "June";} if (mm == 7) {mname = "July";} if (mm == 8) {mname = "August";} if (mm == 9) {mname = "September";} if (mm == 10) {mname = "October";} if (mm == 11) {mname = "November";} if (mm == 12) {mname = "December";} printf("%d is month %s", mm, mname); return 0; } 

il a donné une affectation d’erreur à l’expression avec le type tableau. s’il vous plaît aider

En prenant Michael Walz deux excellents commentaires et en les ajoutant comme réponse:

 #include  #include  void main(int argc, char** argv) { int mm = 0; printf("Please enter a month number [1-12]:\n"); scanf("%d", &mm); static const char* months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; if (mm >= 1 && mm <= 12) { printf("%d is month %s", mm, months[mm - 1]); } else { printf("You have entered an invalid month number %d\n", mm); } } 

Le contrôle de validité a été effectué (mentionné dans les commentaires ci-dessus).

J'espère que ça aide.

À votre santé,

Gars.

Fondamentalement, les types de tableaux sont des pointeurs constants. Par conséquent, lorsque vous essayez d’atsortingbuer une nouvelle valeur au pointeur mname, le compilateur détecte une erreur.

Vous pouvez utiliser la fonction strcpy comme dans l’exemple suivant pour résoudre le problème:

  if (mm == 1) { strcpy(mname, "January"); } 

Il existe fondamentalement deux manières différentes de penser / parler de chaînes:

  1. Un tableau de caractères, terminé par un caractère '\0' . (Ceci est la définition formelle d’une chaîne en C.)

  2. En tant que pointeur sur un caractère, ou char * , pointant sur le premier d’une séquence (un tableau) de caractères, se terminant par un caractère '\0' .

Vous pouvez donc déclarer un tableau et y copier une chaîne:

 char arrayssortingng[10]; strcpy(arrayssortingng, "Hello"); 

Ou vous pouvez déclarer un tableau et lui donner une valeur initiale lorsque vous le déclarez:

 char arrayssortingng2[] = "world!"; 

Ou vous pouvez déclarer un pointeur et le faire pointer vers une chaîne:

 char *pointerssortingng; pointerssortingng = "Goodbye"; 

Ou vous pouvez déclarer un pointeur et lui donner une valeur initiale:

 char *pointerssortingng2 = "for now"; 

Cela vaut la peine de connaître leur “apparence” dans la mémoire:

  +---+---+---+---+---+---+---+---+---+---+ arrayssortingng: | H | e | l | l | o |\0 |\0 |\0 |\0 |\0 | +---+---+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+ arrayssortingng2: | w | o | r | l | d | ! |\0 | +---+---+---+---+---+---+---+ +---------------+ pointerssortingng: | * | +-------|-------+ | +---+---+---+---+---+---+---+---+ +---------> | G | o | o | d | b | y | e |\0 | +---+---+---+---+---+---+---+---+ +---------------+ pointerssortingng2: | * | +-------|-------+ | +---+---+---+---+---+---+---+---+ +---------> | f | o | r | | n | o | w |\0 | +---+---+---+---+---+---+---+---+ 

Le problème est que vous ne pouvez pas assigner de tableaux en C. Vous pouvez affecter des pointeurs. Vous pouvez également utiliser la règle spéciale (“l’équivalence entre des tableaux et des pointeurs”) selon laquelle, lorsque vous utilisez un tableau dans une expression, vous obtenez un pointeur sur le premier élément du tableau.

Donc, si vous voulez assigner une chaîne en tant que pointeur à une autre chaîne en tant que pointeur, cela fonctionne:

 pointerssortingng = pointerssortingng2; 

Si vous essayez d’affecter un ssortingng-as-array à un autre ssortingng-as-array, cela ne fonctionne pas

 arrayssortingng = arrayssortingng2; /* WRONG -- comstackr complains, attempt to assign array */ 

Si vous voulez copier un ssortingng-as-array dans un autre, vous devez appeler strcpy (et bien sûr vous devez vous inquiéter du débordement):

 strcpy(arrayssortingng, arrayssortingng2); 

Vous pouvez également affecter un ssortingng-as-array à un ssortingng-as-pointer:

  pointerssortingng = arrayssortingng; 

Cela fonctionne parce que le compilateur le traite exactement comme si vous aviez écrit

 pointerssortingng = &arrayssortingng[0]; 

Enfin, si vous essayez d’affecter un pointeur de chaîne à un tableau, cela ne fonctionnera pas, encore une fois, car vous ne pouvez pas affecter de tableau:

  arrayssortingng = pointerssortingng; /* WRONG */ 

Encore une fois, vous pouvez appeler strcpy place, tant que vous êtes sûr que la chaîne va tenir:

 strcpy(arrayssortingng, pointerssortingng); /* but worry about overflow */ 

Dans votre code d’origine, mname était une chaîne en tant que tableau, vous ne pouvez donc pas l’affecter. Vous avez deux choix:

  1. Utilisez strcpy pour y copier des chaînes:

    if (mm == 1) { strcpy(mname, "January"); }

  2. Déclarez mname comme pointeur pa à la place:

    char *mname;

    if (mm == 1) { mname = "January"; }


Addendum: Pour être complet, je devrais mentionner un autre ensemble de points.

Lorsque vous initialisez un pointeur sur une chaîne, procédez de l’une des manières suivantes:

 char *pointerssortingng = "Goodbye"; char * pointerssortingng2; pointerssortingng2 = "for now"; 

ces chaînes "Goodbye" et "for now" sont en lecture seule . Vous ne pouvez pas les modifier. Donc, si vous essayez de faire quelque chose comme

  strcpy(pointerssortingng, pointerssortingng2); /* WRONG: overwriting constant ssortingng */ 

cela ne fonctionnera pas, car vous essayez de copier la deuxième chaîne dans la mémoire où la première chaîne est stockée, mais cette mémoire n’est pas accessible en écriture.

Ainsi, lorsque vous utilisez des tableaux, vous ne pouvez pas utiliser d’affectation, vous devez utiliser strcpy ; mais lorsque vous utilisez des pointeurs, vous pouvez utiliser l’assignation et vous ne pouvez probablement pas appeler strcpy .