Je traite généralement les tableaux de chaînes de cette façon, car cela me permet de ne pas spécifier de limite de caractères:
#include <stdio.h> #include <stdlib.h> #include "main.h" int main() { Person john = {{"John","Doe"}}; john.names = {"John","Doe"}; // Expected expression error printf("%s\n",john.names[0]); printf("%s\n",john.names[1]); return 0; }
Je suis incapable de reproduire cela en utilisant une structure.
J'ai essayé avec les deux john.names = {"John", "Doe"};
et john. * names = {"John", "Doe"}
. Mais j'obtiens une erreur d'expression attendue.
Cependant, je peux le faire lors de l'initialisation avec Person john = {{"John", "Doe"}};
. Je ne suis donc pas sûr qu'il soit autorisé de procéder ainsi uniquement lors de l'initialisation.
typedef struct Person Person; struct Person { char *names[2]; };
char *names[2] = {"John","Doe"}; printf("%s\n",*((names))); printf("%s\n",*((names)+1));
Quelle serait l'expression "attendue" ", suis-je autorisé à faire cela?
3 Réponses :
Pour l'initialisation d'un champ / attribut spécifique, vous pouvez faire quelque chose comme ce qui suit lors de la déclaration:
Personne john = {.names = {"John", "Doe"}};
Pour initialiser des champs supplémentaires, disons adresse
et noms
, cela peut être fait comme suit:
Personne john = {.names = {"John", "Doe"}, .address = "foo"};
Après la déclaration, vous devrez spécifier l'index du tableau.
john.names [0] = "John"
"Après la déclaration, vous devrez spécifier l'index du tableau." Donc, d'après ce que je comprends, il n'y a aucun moyen d'utiliser des crochets après l'initialisation?
Pour remplir plusieurs index? c'est-à-dire 0,1 en même temps? Non.
@shellwhale: C ne prend pas en charge l'affectation de tableau - et john.names =…
tente de l'assigner à un tableau.
Les tableaux ne sont pas des éléments de première classe en C. Vous pouvez initialiser un tableau complet, mais vous ne pouvez affecter qu’aux éléments non-tableau, c'est-à-dire scalaires, pointeurs ou structures.
Lorsque vous écrivez
char *names[2]; names = {"John","Doe"}; // syntax error here
, c'est une initialisation, pas une affectation. Et l'affectation suivante serait également étouffée par une erreur de syntaxe:
char *names[2] = {"John","Doe"};
Eh bien, je suppose qu'il existe des moyens d'accéder au contenu d'une structure, la façon dont je l'ai appris de mon côté est pour une structure qui ressemble à ça //
typedef struct struc_person
{
char * nom [2];
} type_person;
type_person->name[0] = value_of_the_first_name; type_person->name[1] = value_of_the_surname;
Cela dépend de ce que représente type_person
dans votre exemple d'affectation: s'il s'agit d'un pointeur vers le type_person
que vous avez tapé, alors oui, vous utiliserez ->
mais si c'est une instance de la structure, alors c'est .
. Tel qu'il est écrit, cela ne compilerait pas, mais si vous vouliez dire que type_person
était une instance de type_person
, vous devez utiliser .
et non ->
ici.
@xing oui bien sûr, j'utilise ceci pour
printf
juste avant monreturn 0
. Mais ce que je voudrais, c'est pouvoir utiliser des parenthèses.