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 espaces dans chaine de caractères


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Points : 82
    Points
    82
    Par défaut suppression espaces dans chaine de caractères
    Bonjour,

    Certainement que la question est connue mais je recherche une fonction qui supprime les espaces inutiles en début et fin de chaine de caractère.

    Exemple :
    char * test = " boujour à tous "
    strip(test);
    printf(test);
    //test = "bonjour à tous"

    Merci d'avance.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Déjà, pas avec une chaîne constante.

    Pour les String de .Net et les CString de MFC, il y a des fonctions trim() (ou TrimLeft()/TrimRight()).
    J'ignore s'il y a cela pour les std::string du C++ standard.
    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
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Hum comme deja dit, surement pas avec une chaine constante comme tu le montre ou dans le pire des cas, tu peut créer des fonctions qui travaillent depuis une chaine constante mais alors qui t'en renvoient une autre !

    Donc, une boucle qui parcours depuis le debut (ltrim) et qui supprime tous les espaces jusqu'à rencontrer le 1° caractère qui n'en sera pas un puis une autre boucle (ou autre fonction: rtrim qui commence depuis la fin ...

    C'est ce que j'ai fait en C tout en créant mon propre objet string !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 86
    Points : 97
    Points
    97
    Par défaut
    salut,

    cette fonction devrait faire l'affaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void stripSpaces( char *x )
    {
      char *xi;
     
      for( xi = x ; *x != '\0' ; ++x ) {
        if( *x != ' ' )
          *(xi++) = *x;
      }
     
      *xi = '\0';
    }
    attention, elle reecrit la chaine d'origine, ce qui est tres sale (l'ideal serait de lui passer un pointeur sur une zone memoire de la taille de la chaine d'origine, ou elle irait ecrire le resultat).

    bien sur, ne pas lui passer de const char * en parametre.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 86
    Points : 97
    Points
    97
    Par défaut
    arf.. desole, j'ai lu trop vite.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par pirus
    arf.. desole, j'ai lu trop vite.
    Hum ouais effectivement, là tu enlève tous les espaces
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par alex'l
    je recherche une fonction qui supprime les espaces inutiles en début et fin de chaine de caractère.
    Rien de standard. Il faut le faire toi même. C'est pas très compliqué, mais il faut être rigoureux... Il y a des cas tordus. Bien sûr, la chaine doit être modifiable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       char test[] = "   boujour à tous  ";
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par alex'l
    Bonjour,

    Certainement que la question est connue mais je recherche une fonction qui supprime les espaces inutiles en début et fin de chaine de caractère.

    Exemple :
    char * test = " boujour à tous "
    strip(test);
    printf(test);
    //test = "bonjour à tous"

    Merci d'avance.
    Attention àce que la chaine soit modifiable. Ici test peut être mis en mémoire d'accès en lecture seule, donc il faudrait une copie.

    Facile, voici une version qui marche souvent, mais un très grave bug s'y cache, lequel ?

    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
    #include <ctype.h>
    #include <stdio.h>
    #include <string.h>
     
    char * stripspace(char * str) 
    {
      if(str)
      {
          size_t lg = strlen(str);  
          char * p = str + lg -1;
          while(isspace( (unsigned)*p) ) { --p; }
          *(p+1) = '\0';
          p = str; 
          while(isspace( (unsigned)*p) ) { ++p; }
          str = p;
      }
      return str;
    }
     
     
     
    int main(void)
    {
        char s[] = "    coucou  les gens   ";
     
        printf("|%s|\n",s);
        printf("|%s|\n",stripspace(s));
     
        return 0;
    }
    A+

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Points : 82
    Points
    82
    Par défaut
    ok, merci à tous, je pensais bien qu'il n'y avait rien de standard donc je vais le faire moi même...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Foobar1329 : Elle foire si la chaîne est vide?
    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.

  11. #11
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Essaie ca:
    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
     
    #include <stdio.h>
    #include <string.h>
     
    void strip(char *src,char *dst)
    {
        int src_len=0;
        int i=0;
     
        src_len=strlen(src);//Recupere la longueur de la chaine de depart
     
        dst=src;
     
        while((i<src_len)&&(src[i]==' '))
        {
             *dst++;//Place le pointeur dst au debut de la chaine sans espace
             i++;
        }
     
        i=src_len-2;//-2 pour eviter le caractere \0
     
        while((i>=0)&&(src[i]==' '))
        {
             src[i]='\0';
             i--;
        }
    }

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ou NULL !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Ou ca ou NULL?

  14. #14
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Foobar1329 :
    Facile, voici une version qui marche souvent, mais un très grave bug s'y cache, lequel ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         while(isspace( (unsigned)*p) ) { --p; }
          *(p+1) = '\0';
    Et plus vicieux qu'une chaîne vide ou un NULL : elle foire si la chaîne ne contient que des espaces et est précédée (par un malencontreux hazard) en mémoire par au moins un code équivalent à un code espace.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    Points : 82
    Points
    82
    Par défaut
    Merci, à tous... Je vais choisir une de vos fonctions... je ne pensais pas avoir autant de réponses!...

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par drcd
    Ou ca ou NULL?
    Comme il n'y a pas d'accent sur le u c'est "ou bien NULL", on cherchait le bug vicieux, je n' avait pas vu effectivement que si la chaîne ne contient que des espaces, on dépassait le début de chaîne, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         while(p >= str && isspace( (unsigned)*p) ) 
              { --p; }
          *(p+1) = '\0';
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  17. #17
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par Trap D
    Comme il n'y a pas d'accent sur le u c'est "ou bien NULL", on cherchait le bug vicieux, je n' avait pas vu effectivement que si la chaîne ne contient que des espaces, on dépassait le début de chaîne, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         while(p >= str && isspace( (unsigned)*p) ) 
              { --p; }
          *(p+1) = '\0';

    Citation Envoyé par diogene
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         while(isspace( (unsigned)*p) ) { --p; }
          *(p+1) = '\0';
    Et plus vicieux qu'une chaîne vide ou un NULL : elle foire si la chaîne ne contient que des espaces et est précédée (par un malencontreux hazard) en mémoire par au moins un code équivalent à un code espace.
    Well done !!

    Mais plutôt que la correction proposée par TrapD, il est plus explicite de faire :

    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
    char * stripspace(char * str) 
    {
      if(str)
      {
          size_t lg = strlen(str);  
          if (lg) {
             char * p = str + lg -1;
             while(isspace( (unsigned)*p) ) { --p; }
             *(p+1) = '\0';
             p = str; 
             while(isspace( (unsigned)*p) ) { ++p; }
             str = p;
          }
      }
      return str;
    }
    A+

  18. #18
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu ne corriges rien
    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
    char * stripspace(char * str) 
    {
      if(str)
      {
          size_t lg = strlen(str);  
          if (lg) {
             char * p = str + lg -1;
             while(isspace( (unsigned)*p) ) { --p; }
             *(p+1) = '\0';
             p = str; 
             while(isspace( (unsigned)*p) ) { ++p; }
             str = p;
          }
      }
      return str;
    }
    La boucle infernale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            while(isspace( (unsigned)*p) ) { --p; }
    est toujours opérante, et si comme le dit Diogène avant str il y a un espace tu vas gaiement dans le décor !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  19. #19
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par Trap D
    Tu ne corriges rien
    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
    char * stripspace(char * str) 
    {
      if(str)
      {
          size_t lg = strlen(str);  
          if (lg) {
             char * p = str + lg -1;
             while(isspace( (unsigned)*p) ) { --p; }
             *(p+1) = '\0';
             p = str; 
             while(isspace( (unsigned)*p) ) { ++p; }
             str = p;
          }
      }
      return str;
    }
    La boucle infernale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            while(isspace( (unsigned)*p) ) { --p; }
    est toujours opérante, et si comme le dit Diogène avant str il y a un espace tu vas gaiement dans le décor !
    Hum... je voyais bien le coup de faire pointer p vers str-1 à un endroit où un espace était susceptible d'y être, mais, oui, si c'est " " par exple, ça peut foirer aussi, je ne sais plus lire une condition .

    =>

    Citation Envoyé par Trap D
    Comme il n'y a pas d'accent sur le u c'est "ou bien NULL", on cherchait le bug vicieux, je n' avait pas vu effectivement que si la chaîne ne contient que des espaces, on dépassait le début de chaîne, il faut faire

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(p >= str && isspace( (unsigned)*p) ) 
              { --p; }
          *(p+1) = '\0';
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Enlever espace et underscore dans chaine de caractères
    Par pasterlouis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/08/2013, 09h28
  2. Suppression espaces dans chaine caractères
    Par Hawaisunset dans le forum SAP
    Réponses: 2
    Dernier message: 12/02/2013, 16h00
  3. Recherche de texte dans chaine de caractère
    Par Requin15 dans le forum Oracle
    Réponses: 13
    Dernier message: 14/09/2006, 12h10
  4. [RegEx] suppression mot dans chaine
    Par vivian dans le forum Langage
    Réponses: 3
    Dernier message: 18/07/2006, 18h23
  5. [sql] Espace dans chaine
    Par Kasanova75 dans le forum Oracle
    Réponses: 6
    Dernier message: 07/03/2006, 14h27

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