En C, pourquoi ne puis-je pas assigner une chaîne à un tableau de caractères après qu'il soit déclaré?

ça m'ennuie depuis un moment.

struct person {
       char name[15];
       int age;
};
struct person me;
me.name = "nikol";

lors de la compilation je reçois cette erreur:

erreur: types incompatibles lors de l'affectation au type "char[15]" à partir du type "char *

est-ce que je manque quelque chose d'évident ici?

9

6 réponses

Les matrices

sont des citoyens de seconde classe en C, elles ne supportent pas l'assignation.

char x[] = "This is initialization, not assignment, thus ok.";

cela ne fonctionne pas:

x = "Compilation-error here, tried to assign to an array.";

utiliser des fonctions de bibliothèque ou copier manuellement chaque élément pour lui-même:

#include <string.h>
strcpy(x, "The library-solution to string-assignment.");
14
répondu Deduplicator 2014-11-01 21:45:38

me.name = "nikol"; est faux !! vous devez utiliser strcpy()

quand vous faites x = "Some String" , en fait, vous mettez l'adresse de départ de la chaîne statique "Some String" dans la variable x . Dans votre cas, name est un tableau statique, et vous ne pouvez pas modifier l'adresse. Ce dont vous avez besoin, c'est de copier votre chaîne de caractères dans le tableau déjà alloué name . Pour cela, utilisez strcpy() .

4
répondu Sourav Ghosh 2014-11-01 21:45:33

tout D'abord, vous devez savoir les points suivants:

  • en C, les chaînes de texte ne sont que des tableaux.
  • en C, Les variables de tableau sont fondamentalement juste des pointeurs.

donc, char mytext[12]; est essentiellement une simple déclaration d'un pointeur de char appelé mytext qui stocke l'adresse du premier (zéro'TH) élément du tableau/chaîne.

ce code est par conséquent valable:

#include <stdio.h>
int main(int argc, char *argv[])
{
    const char a[] = "Hello";
    const char *b = a;
    printf("%s\n", b);
    return 0;
}

la chose importante à noter ici est que la réaffectation b ne change pas le contenu de tout ce qu'il pointe-il change la chose qu'il pointe.

cependant, il sont cas où les tableaux et les pointeurs se comportent différemment. Dans l'exemple ci-dessus, a ne peut pas être modifiée. Si vous essayez, vous obtenir une erreur .

pour revenir à votre exemple original, cette structure:

struct person{
    char name[15];
    int age;
};

...peut être considéré comme une structure de 19 octets* dont les 15 premiers octets sont réservés pour stocker une chaîne. Le name attribut stocke l'adresse du premier octet, donc, vous savez où ces 15 octets vivre dans la mémoire, vous avez juste besoin d'écrire quelque chose d'utile.

C'est là que des fonctions telles que sprintf() ou strcpy() entrent en jeu - ils copier des données dans l'adresse définie par name plutôt que de re-affectation de name lui-même.

* en supposant que sizeof(int) est 4 et que la structure n'est pas rembourrée, bien sûr...

3
répondu GoBusto 2014-11-01 22:24:28

l'initialisation:

char name[15]

crée un tableau de caractères de 15 octets.

"nikol" est une chaîne littérale, qui est de type 'char *', c'est-à-dire un pointeur vers une chaîne. Ce sont des types incompatibles. Vous devez copier la chaîne dans le tableau, comme suit:

strcpy(me.name, "nikol")
0
répondu Brett 2014-11-01 21:50:40

Utiliser strcpy() fonction (de string.h bibliothèque) :)

main(){
struct person{
       char name[15];
       int age;
};
struct person me;
strcpy(me.name,"nikol");
}
-1
répondu LucaLumetti 2014-11-01 22:01:37

vous essayez de changer l'adresse mémoire d'un pointeur de tableau (en me donnant.nom = "nikol") ce qui est impossible. Nom du tableau (me.nom) est un pointeur fixe et ne peut pas être changé pour pointer vers un nouvel emplacement de chaîne ("nikol") parce que l'adresse de mémoire d'un pointeur de tableau est sur le premier membre de ce tableau. Si vous voulez assigner une chaîne après avoir déclaré (me.nom = "nikol"), utilisez le pointeur externe *nom à la place parce que le pointeur externe flotte à l'extérieur du tableau de sorte que sa valeur peut être changée à la volée.

struct person {
       char *name;
       int age;
};
struct person me;
me.name = "nikol"; // no error
-1
répondu Ray Chakrit 2018-09-16 06:39:50