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 confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    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 éprouvé
    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
    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 éprouvé
    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
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    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
    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 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  ";

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    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 très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    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 : 366
    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
    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 très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    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 : 366
    Par défaut
    Ou ca ou NULL?

  14. #14
    Expert confirmé
    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
    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.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 118
    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
    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 chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    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
    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 chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    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