Partage
  • Partager sur Facebook
  • Partager sur Twitter

Effacer le contenu d'une chaîne

Sujet résolu
    26 juin 2006 à 0:27:29

    Bonjour!
    je voulais savoir si il est possible d'effacer le contenu d'une chaîne, pendant un programme en C. J'y arrive à la déclaration des variables, grâce à :
    char chaine[50]={""};
    mais plus loin dans le programme je ne vois pas comment faire.
    Merci de votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      26 juin 2006 à 0:45:52

      Tu peux tout simplement faire ça : chaine[0] = '\0', ta chaîne sera alors considérée comme la chaîne vide.
      • Partager sur Facebook
      • Partager sur Twitter
        26 juin 2006 à 4:45:03

        Citation

        Tu peux tout simplement faire ça : chaine[0] = '\0', ta chaîne sera alors considérée comme la chaîne vide.



        Oui mais le reste de la chaîne sera alors toujours présent en mémoire, donc vaut mieux mettre toutes la valeurs à 0.

        Alors soit tu crée une fonction qui vide les chaines toi-même :

        void bufferZero(char *chaine)
        {
            int i = 0, len = strlen(chaine);
           
            while ( i < len )
            {
                chaine[i] = 0;
                i++;
            }
        }


        Sinon il y a aussi :

        memset(chaine, 0, sizeof(chaine));

        /* et ... */

        bzero(chaine, sizeof(chaine));


        ;)
        • Partager sur Facebook
        • Partager sur Twitter
          26 juin 2006 à 11:36:24

          Bah, vu que les chaînes sont manipulés à la manière C (on cherche une chaîne terminée par un '\0'), ça n'a pas plus de sens de mettre toutes les valeurs à 0 plutôt que de les laisser comme elles sont, si le premier caractère est un '\0'.

          C'est juste que faire ça, ça tape plus à l'oeil c'est sûr, ça fait plus ordonné mais bon...

          Citation : ddx39

          Oui mais le reste de la chaîne sera alors toujours présent en mémoire, donc vaut mieux mettre toutes la valeurs à 0.

          Alors soit tu crée une fonction qui vide les chaines toi-même :

          void bufferZero(char *chaine)
          {
              int i = 0, len = strlen(chaine);
             
              while ( i < len )
              {
                  chaine[i] = 0;
                  i++;
              }
          }




          Là par exemple, si tu as un buffer de 50, et que le 10ème caractère est un '\0', ça ne marchera pas, vu comment fonctionne strlen.

          Citation : ddx39


          Sinon il y a aussi :

          memset(chaine, 0, sizeof(chaine));

          /* et ... */

          bzero(chaine, sizeof(chaine));



          ;)



          La ça marche par contre. Mais ça ne marchera pas avec des buffers alloués dynamiquement =).

          Enfin il fait comme il veut, mais s'il veut tout mettre à zéro, il sera limité par le principe de fonctionnement des strings du C quoi :) .
          • Partager sur Facebook
          • Partager sur Twitter
            26 juin 2006 à 11:55:36

            Il faut que tu met :

            chaine[0] = '\0';

            c'est plus logique. ;)


            EDIT: mais enfait, pour quoi tu veut rendre la chaine vide ? je demende ça parce qu'il y a plusieur maniére de manipuler un chaine pour lui changer ça valeur -par exemple- (si c'est ce que tu veut faire).
            en peut meme manipuler juste avec les '\0' ;


            • Partager sur Facebook
            • Partager sur Twitter
              26 juin 2006 à 12:01:18

              @ddx39

              A mon avis ca ne sert a rien de tout mettre à 0. Quand tu déclares une chaine char chaine[50], elle contient 50 valeurs aléatoires. Si tu lui donnes la valeur "" seul le premier caractère sera mis à 0.

              Ce qu'il faut bien comprendre c'est que ce n'est pas parceque tout est à 0 que la chaine prend moins de place. Ca ne libère pas la mémoire quoi qu'il arrive, ta chaine faisait 50 au début elle fera 50 à l'arrivé.
              • Partager sur Facebook
              • Partager sur Twitter
                26 juin 2006 à 13:00:59

                Bah sinon, tu la joues bourrin, tu déclares ta chaine dans un bloc, et pour la vider, tu en sors ^^
                • Partager sur Facebook
                • Partager sur Twitter
                  26 juin 2006 à 13:02:40

                  C'est pas bete oui. Sinon il y a tjr possibilité de malloc/free.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 juin 2006 à 13:05:31

                    Citation : lexou

                    C'est pas bete oui. Sinon il y a tjr possibilité de malloc/free.




                    En fait, j'aimerais comprendre l'utilité d'effacer une chaine de la mémoire..

                    C'est si short que ça en mémoire?? C'est pour la sécurité?
                    Je comprends pas l'interet en fait..
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 juin 2006 à 13:27:19

                      Dans un PC, pour 50 char ? Sert à rien. C'est minuscule, comparé à ce que vous manipulez avec vos SDL_Image et tout ça.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 juin 2006 à 13:30:48

                        Ca dépend ce que tu veux faire. Dans certains cas (malloc dans une boucle) la mémoire peu arriver plus vite à saturation qu'il n'y parait. Dans ce cas il faut faire des free.

                        Si par contre si tu fais char machaine[50] alors tu ne peux pas la liberer (ou plutot c'est interdit mais possible). Elle sera automatiquement liberé à la fin du bloc ou elle a été définie. Lors d'un malloc sans free le pointeur est liberé a la fin du bloc mais pas l'espace mémoire sur lequel il pointait, c'est pour ca qu'il faut free avant de perdre le pointeur.

                        En tout cas si tu veux juste utiliser une variable de 50 caracteres ce n'est pas utile d'utiliser malloc/free pour 50 octets.

                        Mais je crois pas que l'auteur veuille effacer (ds le sens liberer la mémoire) il veut que sa chaine soit vide, donc qu'elle commence par '\0' (a mon avis)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 juin 2006 à 9:17:04

                          En fait, c'est pour le TP du jeu du pendu, j'ai fais un programme différent de celui proposé, et j'ai une chaine qui contient un certain nombre d'étoile selon le nombre de lettre du mot à trouver. Le problème est que quand je mets rejouer, si le mot est plus court que le mot précédent, il me met toujours autant d'étoile car je met par exemple cinq étoiles et les trois dernières (si le mot précédent était de huit lettres) ne sont pas effacés.
                          Je sais que ce n'est pas la technique la plus simple mais c'est ce que j'ai trouvé au début et je me demandais si ça pouvait marcher... je vais essayer en mettant des '\0' dans la chaine.
                          Merci de votre aide :) .
                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 juin 2006 à 9:26:34

                            Non alors là il faut faire une alloc dynamique à l'intérieur de ta boucle 'rejouer' et pas avant comme tu l'as sûrement fait !

                            Ou bien comme une chaine s'arrêt au '\0', tu en mets un à maChaine[5] par exemple si ton mot est de 5 lettres ! Mais ça je crois que c'est ce que tu voulais faire !

                            Perso je ferais plutôt un malloc au début de la boucle et un free à la fin, ça me semble plus propre !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 juin 2006 à 19:34:08

                              Ca marche! En mettant comme dernier caractère de la chaîne un '\0'.
                              Merci beaucoup à tous :) .
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                27 juin 2006 à 19:42:01

                                Pour en revenir à la place en mémoire de la chaine de caractère:
                                Ne serait-il pas possible en utilisant la fonction realloc de diminuer la taille de la chaîne en allouant une taille plus petite?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  27 juin 2006 à 20:50:46

                                  char chaine[50]={""};

                                  C'est pas invalide ça ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 juin 2006 à 21:43:33

                                    Citation : remram44

                                    char chaine[50]={""};


                                    C'est pas invalide ça ?


                                    Non, mais les { } ne sont pas nécessaires...

                                    Citation : 0zero0


                                    Pour en revenir à la place en mémoire de la chaine de caractère:
                                    Ne serait-il pas possible en utilisant la fonction realloc de diminuer la taille de la chaîne en allouant une taille plus petite?


                                    Uniquement si elle a été allouée par malloc(). Ne pas oublier de placer le 0 (et de lui garder une place), il ne se mettra pas tout seul...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !

                                    Effacer le contenu d'une chaîne

                                    × 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