IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Suppression dans une chaîne de char


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut Suppression dans une chaîne de char
    Salut,
    Dans les exemples et FAQ du C je trouve le code suivant pour supprimer tous les espaces d'une chaîne de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    char* supprime (const char *src)
    {
      char *dest = NULL, *res;
      int n = strlen (src);
      int i, dansunmot, j = 0;
     
      dest = malloc (n+1);
      if(dest == NULL)
      {
        return NULL;
      }
     
      /* Cherche le premier non espace */
      i = 0;
      while ((i < n) && (src[i] == ' '))
      {
        i++;
      }
     
      /* On est dans un mot */
      dansunmot = 1;
     
      /* Jusqu'a la fin de la chaine */
      while (i < n)
      {
        /* Si c'est un espace, on fait remarquer qu'on n'est plus dans un mot */
        if (src[i] == ' ')
        {
          dansunmot = 0;
        }
        else 
        {
          /* Si on n'est pas dans un mot, on met un espace */
          if (dansunmot == 0)
          {
            dest[j]=' ';
            j++;
          }
          /* On est dans un mot */
          dansunmot = 1;
          /* On copie la lettre */
          dest[j] = src[i];
          /* On incremente l'indice de destination */
          j++;
        }
        /* On incremente l'indice de la source */
        i++;
      }
     
      /* Mettre le '\0' a la fin */
      dest[j] = '\0';
      j++;
     
      /* On realloue pour avoir la bonne taille */
      res = realloc (dest, j);
      if (res)
      {
        return res;
      }
      else
      {
        return dest;
      }
    }
    A vrai dire je demande si un code comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char * str_pack_char( char * z , short c )
    { char * s = z ;
      char * str = s  ; 
      if ( z != NULL )
      {
        while( *z )
        { if( *z != c ) *s++ = *z ;
          z++;
        }
       *s = '\0' ;
      } 
      return str ; 
    }
    ne ferait pas mieux ?
    Mais bon la chaîne rétrécit mais pas son espace mémoire ...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je n'ai pas vu les détails de ton code donc j'ignore s'il marche, mais je le trouve plus approprié en effet.
    L'autre m'a l'air d'une usine à gaz...

    Edit: Mais pour faire plus simple, je supprimerais la variable str et je ferais retourner void à la fonction...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    J'ai l'impression que le code de la faq supprime les espaces en trop et alloue une nouvelle chaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Bonjour       tout le    monde" --> "Bonjour tout le monde"

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Il me semblait que l'exemple de la FAQ voulait faire à la place de "Bonjour tout le monde" un truc du genre "Bonjourtoutlemonde" ?

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dj.motte Voir le message
    A vrai dire je demande si un code comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char * str_pack_char( char * z , short c )
    { char * s = z ;
      char * str = s  ; 
      if ( z != NULL )
      {
        while( *z )
        { if( *z != c ) *s++ = *z ;
          z++;
        }
       *s = '\0' ;
      } 
      return str ; 
    }
    ne ferait pas mieux ?
    Mais bon la chaîne rétrécit mais pas son espace mémoire ...
    C'est vrai que l'exemple de de la FAQ est assez dramatique... J'ai ça dans ma CLIB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    /* ---------------------------------------------------------------------
       STR_DelBlanks()
       ---------------------------------------------------------------------
       Suppression des blancs dans une chaine
       LA CHAINE EST MODIFIEE !!!
       ---------------------------------------------------------------------
       E : Chaine initiale
       S :
       --------------------------------------------------------------------- */
    void STR_DelBlanks (char *const s)
    {
       if (s && *s)
       {
          char const *pr = s;
          char *pw = s;
     
          while (*pr)
          {
             if (*pr != ' ')
             {
                *pw = *pr;
                pw++;
             }
             pr++;
          }
     
          *pw = 0;
       }
    }
    Ca ne doit pas être très éloigné de ta solution...

    EDIT : Si l'exemple de la FAQ consiste à supprimer les espaces en trop, c'est autre chose (mais ça me parait bien compliqué quand même...)

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Pour reprendre l'exemple d'Emmanuel j'aurais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void STR_DelTheChar (char * s, int c )
    {
       if (s && *s)
       {
          char *pr = s;
          char *pw = s;
     
          while (*pr)
          {
             if (*pr != c )
             {
                *pw = *pr;
                pw++;
             }
             pr++;
          }
     
          *pw = 0;
       }
    }
    Stupide de faire une fonction uniquement que pour les espaces... Le "char const * " je ne vois pas l'utilité ?

    Mieux encore serait une fonction de prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char * str_remove_set( char * z, const char * s ) ;
    où l'on supprime dans "z" tous les caractères faisant partie de "s".

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void str_remove_set(char * z, const char * s )
    {
       if ( z && s  )
       {
          char *pr = z;
          char *pw = z;
     
          while (*pr)
          {
             if( ! strchr( s, *pr  ) ) 
             {
                *pw = *pr;
                pw++;
             }
             pr++;
          }
     
          *pw = 0;
       }
    }
    Mais bon ...

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dj.motte Voir le message
    Salut,

    Pour reprendre l'exemple d'Emmanuel j'aurais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void STR_DelTheChar (char * s, int c )
    {
       if (s && *s)
       {
          char *pr = s;
          char *pw = s;
     
          while (*pr)
          {
             if (*pr != c )
             {
                *pw = *pr;
                pw++;
             }
             pr++;
          }
     
          *pw = 0;
       }
    }
    Stupide de faire une fonction uniquement que pour les espaces...
    Bah, merci pour le 'stupide'. Tu prends donc la responsabilité de l'ouverture des hostilités, j'en prend bonne note.
    J'ai repris du code existant qui correspondait à un besoin précis... J'ai pas cherché à monter que j'avais la plus grosse...
    Le "char const * " je ne vois pas l'utilité ?
    Parce qu'on est jamais à l'abri d'une erreur de codage et que donner au compilateur le maximum d'info pour s'en préserver n'est pas inutile pour moi.

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,


    Bah, merci pour le 'stupide'. Tu prends donc la responsabilité de l'ouverture des hostilités, j'en prend bonne note.
    Désolé j'ai été un peu rapide. Je voulais dire que l'on pouvait dans la foulée paramétrer le caractère à supprimer.

    Ceci dit, je n'ai jamais vraiment compris la différence entre "const char*" et "char const *".

    Je comprends bien "const char*" mais l'autre alors je ne vois pas bien ?

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dj.motte Voir le message
    Ceci dit, je n'ai jamais vraiment compris la différence entre "const char*" et "char const *".

    Je comprends bien "const char*" mais l'autre alors je ne vois pas bien ?
    Qui a dit qu'il avait une différence ? Qu'en pense ton livre de C ?

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    const char * est la même chose que char const *
    Par contre, char * const est différent.

    Et on peut les combiner: const char * const.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 13
    Dernier message: 20/11/2006, 17h46
  2. suppression caratère " dans une chaîne
    Par sandra771 dans le forum C
    Réponses: 10
    Dernier message: 16/11/2006, 14h57
  3. Suppression d'espaces dans une chaîne
    Par dafalri dans le forum Langage
    Réponses: 11
    Dernier message: 20/02/2006, 13h13
  4. Réponses: 5
    Dernier message: 03/02/2006, 18h47
  5. Suppression de mots dans une chaîne
    Par psychomatt dans le forum Langage
    Réponses: 7
    Dernier message: 06/08/2004, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo