3
votes

Modifier un tableau de chaînes à partir d'une structure

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.

main.h

typedef struct Person Person;

struct Person
{
    char *names[2];
};

main.c

char *names[2] = {"John","Doe"};
printf("%s\n",*((names)));
printf("%s\n",*((names)+1));

Quelle serait l'expression "attendue" ", suis-je autorisé à faire cela?


1 commentaires

@xing oui bien sûr, j'utilise ceci pour printf juste avant mon return 0 . Mais ce que je voudrais, c'est pouvoir utiliser des parenthèses.


3 Réponses :


3
votes

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"


3 commentaires

"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.



4
votes

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"};


0 commentaires

2
votes

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;


1 commentaires

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.