Partage
  • Partager sur Facebook
  • Partager sur Twitter

Modifier chaîne de caractère ?

Sujet résolu
    30 juin 2020 à 18:10:54

    Bonjour à tous,

    imaginons que j'ai une structure telle que :

    typedef struct eleve{
    
    char nom[30];
    
    int age;
    
    }eleve;

    J'ai maintenant un tableau d'élève tel que :

    int nbEleve = 10;
    eleve* classe = (eleve*) malloc(nbEleve*sizeof(eleve));

    Après avoir initialisé tous mes élèves, j'aimerai supprimer le 8ème. Donc le 8ème deviendrait le 9ème, et le 9ème le 10ème. 

    for(int i = nbElve ; i > 8; i--){
    classe[i] = classe[i-1];
    }
    nbEleve--;

    Comment se fait-il que les noms ne veulent pas se modifier ? Pourtant, un type char nom[n] représente une chaine de caractère immuable, non?

    Faut-il que je passe par des pointeurs ? Comme ça je pourrais modifier ce vers quoi pointe "classe[i]" et non pas la variable "classe[i].nom" ?

    Merci pour votre aide...

    Cordialement



    • Partager sur Facebook
    • Partager sur Twitter
      30 juin 2020 à 19:02:20

      Ce n'est pas plutôt :

              classe[i-1] = classe[i];

      Que tu voulais faire ?

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        30 juin 2020 à 20:56:38

        salut je ferais ma boucle comme cela :

        for(int i = pos_to_pop; i < NbrEleve -1; i++){
           classe[i] = classe[i+1];
        }
        NbrEleve--;

        En parcourant la boucle dans l'autre sens tu remplaces toutes les cases par la dernière valeur.

        • Partager sur Facebook
        • Partager sur Twitter
          30 juin 2020 à 21:06:03

          Vu que les éléments du tableau 'classe' sont des chaînes de caractères, ne vaudrait-il pas mieux faire :

              strcpy(classe[i], classe[i+1]);

          ?

          ------

          EDIT : Ah oui, c'est une structure, pas seulement une chaîne de caractères... (C'est pas ma faute, c'est le titre qui m'a trompé ! :-° )

          -
          Edité par robun 30 juin 2020 à 22:26:34

          • Partager sur Facebook
          • Partager sur Twitter
            30 juin 2020 à 21:10:01

            strcpy sur une structure ! Tu es bien sur que ça va marcher !
            • Partager sur Facebook
            • Partager sur Twitter
              30 juin 2020 à 21:32:24

              Merci à tous pour vos réponses.

              Le problème n'est pas ds la boucle, mais bien dans la copie. La boucle fonctionne.

              Un strcpy sur les noms ne semble pas fonctionner (et sur une structure encore moins lol), je ne sais pas pourquoi...

              Comme si ma valeur, une fois initialisée ne voulait plus être modifiée...



              -
              Edité par K4limer0 30 juin 2020 à 21:34:59

              • Partager sur Facebook
              • Partager sur Twitter
                30 juin 2020 à 21:36:14

                Quand tu fais :

                classe[8] = classe[9] 

                sa copie classe[9] dans classe[8] et non l'inverse ! 

                Quand tu fais  x = 5   ça ne copie pas x dans 5  !!!

                edit : Si vous ne comprenez pas, c'est une réponse à un message supprimé !

                -
                Edité par rouloude 30 juin 2020 à 21:37:46

                • Partager sur Facebook
                • Partager sur Twitter
                  30 juin 2020 à 21:44:05

                  Oui je sais je m'étais trompé j'avais mal compris. Au temps pour moi.

                  Je précise que si je copie juste comme BrigitteLPB l'écrit ça copie tout, sauf le nom !

                  -
                  Edité par K4limer0 30 juin 2020 à 21:52:40

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 juin 2020 à 23:35:50

                    K4limer0 a écrit:

                    Oui je sais je m'étais trompé j'avais mal compris. Au temps pour moi.

                    Je précise que si je copie juste comme BrigitteLPB l'écrit ça copie tout, sauf le nom !

                    -
                    Edité par K4limer0 il y a environ 1 heure

                    Pourquoi ne pas faire un memcpy() plutôt que strcpy de la longueur de la structure?

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      1 juillet 2020 à 0:06:31

                      Et pourquoi pas, tout simplement l'affectation ! Les structure sont copiable avec l'opérateur d'affectation. s'il n'y a pas de pointeur dans la structure ça ne pose pas de problème, ce qui est le cas ici !

                      Mais pour vraiment cerner le problème, il faudrait avoir le code réel ! 

                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 juillet 2020 à 9:29:33

                        Le problème ne venait pas de la copie, mais d'une partie de mon programme qui buggait. Ca fonctionne, en copiant une structure on copie aussi une variable char toto[n] sans avoir à passer par un strcpy_s.

                        Merci ! Sujet clos ! 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          1 juillet 2020 à 9:41:59

                          K4limer0 a écrit:

                          Ca fonctionne, en copiant une structure on copie aussi une variable char toto[n] sans avoir à passer par un strcpy_s.

                          On peut copier une structure avec l'opérateur d'affectation, mais alors pour un tableau ça n'est pas possible ! 

                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 juillet 2020 à 10:43:08

                            rouloude a écrit:

                            K4limer0 a écrit:

                            Ca fonctionne, en copiant une structure on copie aussi une variable char toto[n] sans avoir à passer par un strcpy_s.

                            On peut copier une structure avec l'opérateur d'affectation, mais alors pour un tableau ça n'est pas possible ! 


                            Si tu relis bien ce que j'ai écris, j'ai dit que la copie d'une structure inclue la copie de la variable chaine de caractère, qui n'est pas un pointeur mais bien un char var[n]. Je copie une structure, pas un tableau.....

                            Cdt.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              1 juillet 2020 à 11:01:46

                              Ok, J'ai mal compris ta phrase : 

                              K4limer0 a écrit:

                              Ca fonctionne, en copiant une structure on copie aussi une variable char toto[n] sans avoir à passer par un strcpy_s.

                              Elle est pourtant bien explicite !



                              • Partager sur Facebook
                              • Partager sur Twitter
                                1 juillet 2020 à 18:38:42

                                En principe, on devrait pouvoir recopier avec une affectation toute structure de longueur fixe allant du simple char en passant par les int et double jusqu'aux structures.
                                Je ne vois pas pourquoi on ne peut pas recopier des structures avec pointeurs. Siles objets auxquels ils se refèrent ne bougent pas, ça ne devrait pas poser de problème.
                                On peut toujours déplacer soi-même une structure avec ou sans pointeur avec memcpy ou tout autre moyen.
                                S'il y a un pointeur ailleurs qui y fait référence, c'est la responsabilité du programmeur que de veuiller à changer la valeur de ce pointeur.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Le Tout est souvent plus grand que la somme de ses parties.

                                Modifier chaîne de caractère ?

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown