69 votes

Copie d'une structure vers une autre

Je sais que je peux copier la structure membre par membre, mais au lieu de cela, puis-je faire un memcpy sur les structures ?

Est-il conseillé de le faire ?

Dans ma structure, j'ai également une chaîne de caractères comme membre que je dois copier dans une autre structure ayant le même membre. Comment puis-je le faire ?

4 votes

Pourquoi parlez-vous de "fonctions membres" dans une question étiquetée "C" ?

2 votes

Pourriez-vous nous montrer la structure ou du moins un extrait de celle-ci ? Je suppose que la chaîne n'est pas un membre fonction seulement un membre, car nous parlons d'un simple C ici. La "chaîne" est-elle un tableau de chars, un char* alloué dynamiquement ou quoi ?

2voto

Anvesh Points 1

Vous pouvez utiliser la solution suivante pour atteindre votre objectif :

struct student 
{
    char name[20];
    char country[20];
};
void main()
{
    struct student S={"Wolverine","America"};
    struct student X;
    X=S;
    printf("%s%s",X.name,X.country);
}

0voto

splugenbrau Points 15
  1. Vous pouvez utiliser un struct pour lire et écrire dans un fichier. Vous n'avez pas besoin de le caster comme un `char*. La taille de la structure sera également préservée. (Ce point n'est pas le plus proche du sujet mais devinez le : le comportement de la mémoire dure est souvent similaire à celui de la mémoire vive).

  2. Pour déplacer (vers et depuis) un seul champ de chaîne, vous devez utiliser strncpy et un tampon de chaîne transitoire '\0' terminaison. Quelque part, vous devez vous souvenir de la longueur du champ de la chaîne d'enregistrement.

  3. Pour déplacer d'autres champs, vous pouvez utiliser la notation par points, par ex : NodeB->one=intvar; floatvar2=(NodeA->insidebisnode_subvar).myfl;

    struct mynode {
        int one;
        int two;
        char txt3[3];
        struct{char txt2[6];}txt2fi;
        struct insidenode{
            char txt[8];
            long int myl;
            void * mypointer;
            size_t myst;
            long long myll;
             } insidenode_subvar;
        struct insidebisnode{
            float myfl;
             } insidebisnode_subvar;
    } mynode_subvar;
    
    typedef struct mynode* Node;
    
    ...(main)
    Node NodeA=malloc...
    Node NodeB=malloc...
  4. Vous pouvez intégrer chaque chaîne dans une structure qui lui correspond, pour échapper au point 2 et se comporter comme Cobol : NodeB->txt2fi=NodeA->txt2fi ...mais vous aurez toujours besoin d'une chaîne transitoire plus une strncpy comme mentionné au point 2 pour scanf , printf sinon un opérateur plus long en entrée (plus court), n'aurait pas été tronqué (par des espaces paddés).

  5. (NodeB->insidenode_subvar).mypointer=(NodeA->insidenode_subvar).mypointer créera un alias du pointeur.

  6. NodeB.txt3=NodeA.txt3 entraîne le rejet par le compilateur : error: incompatible types when assigning to type ‘char[3]’ from type ‘char *’

  7. Le point 4 ne fonctionne que parce que NodeB->txt2fi & NodeA->txt2fi appartiennent au même typedef ! !

    J'ai trouvé une réponse correcte et simple à ce sujet à l'adresse suivante En C, pourquoi ne puis-je pas assigner une chaîne de caractères à un tableau de caractères après qu'il a été déclaré ? "Les tableaux (également de caractères) sont des citoyens de seconde classe en C" !!!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X