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 :

Effectuer un "trim" sur une chaine de caractere


Sujet :

C

  1. #1
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut Effectuer un "trim" sur une chaine de caractere
    Bonjour;
    j' ai une chaine de caractere suivante:
    et je voudrais facilement copier dans une autre chaine de caractere:
    en gros je souhaite supprimer les espace avant et apres ma chaine...
    Quelqu'un peut il m'aider (le trim mais je ne trouve pas d'exemple).
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  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
    Le plus dur à faire, c'est le TrimRight() : Concentre-toi sur celui-ci.
    Pour le TrimLeft(), tu peux généralement te contenter d'incrémenter ton pointeur jusqu'au premier caractère non-espace...
    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 habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    ola j'ai rien compris....
    le trim n'est pas une fonction de string.h...
    Qui attend un tableau de char en entrée et qui renvoie le tableau de char sans espace... je trouve pas d'exemple en fait
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  4. #4
    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
    Ce que je dis, c'est que ton trim, tu peux le faire en deux parties: trimright et trimleft.

    Pour trimright, tu dois:
    • calculer la longueur de la chaîne
    • lire la chaîne en partant de la fin
    • t'arrêter au premier caractère qui n'est pas un espace
    • tronquer la chaîne juste derrière le caractère en question

    (enfin, il y a des méthodes pour le faire en une passe façon strrchr(), mais pour un débutant je pense que lire en partant de la fin est plus simple)
    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.

  5. #5
    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 Jayceblaster Voir le message
    en gros je souhaite supprimer les espace avant et apres ma chaine...
    Quelqu'un peut il m'aider (le trim mais je ne trouve pas d'exemple).
    Il ne faut pas 'supprimer' les espaces, mais tout simplement ne pas les copier dans la nouvelle chaine. Une boucle caractères par caractères et un simple 'if' suffit à faire le filtre... C'est trivial.

    P.S. Si il faut préserver les espaces entre les mots, c'est pas si simple. Voir plus loin.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Quelque chose du genre (aux erreurs à la volée près):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	char *L_szDebutCopie;
    	size_t L_iLongueurCopie;
    	L_szDebutCopie = P_szChaineSource;
    	L_iLongueurCopie = P_iLongueurSource;
    	while((L_iLongueurCopie>0)&&(isspace(P_szChaineSource[L_iLongueurCopie-1]))){
    		L_iLongueurCopie--;
    	}
    	if(L_iLongueurCopie>0){
    		while((L_iLongueurCopie>0)&&(isspace(*L_szDebutCopie))){
    			L_szDebutCopie++;L_iLongueurCopie--;
    		}
    	}

  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 3DArchi Voir le message
    Quelque chose du genre (aux erreurs à la volée près):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	char *L_szDebutCopie;
    	size_t L_iLongueurCopie;
    	L_szDebutCopie = P_szChaineSource;
    	L_iLongueurCopie = P_iLongueurSource;
    	while((L_iLongueurCopie>0)&&(isspace(P_szChaineSource[L_iLongueurCopie-1]))){
    		L_iLongueurCopie--;
    	}
    	if(L_iLongueurCopie>0){
    		while((L_iLongueurCopie>0)&&(isspace(*L_szDebutCopie))){
    			L_szDebutCopie++;L_iLongueurCopie--;
    		}
    	}
    La notation hongroise incomprise (à-la-Microsoft) a encore fait des ravages...

    Essayons de rendre la chose opérationnelle :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
    void trim (char *P_szChaineSource)
    {
     
       char *L_szDebutCopie;
       size_t L_iLongueurCopie;
       L_szDebutCopie = P_szChaineSource;
       L_iLongueurCopie = strlen(P_szChaineSource);
       while ((L_iLongueurCopie > 0)
              && (isspace (P_szChaineSource[L_iLongueurCopie - 1])))
       {
          L_iLongueurCopie--;
       }
       if (L_iLongueurCopie > 0)
       {
          while ((L_iLongueurCopie > 0) && (isspace (*L_szDebutCopie)))
          {
             L_szDebutCopie++;
             L_iLongueurCopie--;
          }
       }
    }
     
    int main (void)
    {
       char s[] = "   hello     ";
     
       printf ("s = '%s'\n", s);
       trim (s);
       printf ("s = '%s'\n", s);
     
       return 0;
    }
    Marche pô...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    s = '   hello     '
    s = '   hello     '
     
    Process returned 0 (0x0)   execution time : 0.012 s
    Press any key to continue.
    Beaucoup de caractères gâchés pour rien...

    Essayons quelque chose de plus simple :

    Attention ce code modifie la chaine originelle, ce qui n'est pas demandé par le P.O.

    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
     
    #include <stdio.h>
    #include <string.h>
     
    void trim (char *s)
    {
       char *pr = s;
     
       /* skip the heading spaces */
       while (*pr != 0 && *pr == ' ')
       {
          pr++;
       }
     
       /* kill the trailing spaces if any */
       {
          size_t const len = strlen (s);
          int i = len - 1;
          while (s[i] == ' ')
          {
             s[i] = 0;
             i--;
          }
       }
     
       /* copy the string */
       {
          char *pw = s;
          while (*pr != 0)
          {
             *pw = *pr;
             pw++;
             pr++;
          }
          *pw = 0;
       }
    }
     
    int main (void)
    {
       char s[] = "   hello world     ";
     
       printf ("s = '%s'\n", s);
       trim (s);
       printf ("s = '%s'\n", s);
     
       return 0;
    }
    Ah, ben ça marche...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    s = '   hello world     '
    s = 'hello world'
     
    Process returned 0 (0x0)   execution time : 0.034 s
    Press any key to continue.
    Je remplace le main() de base par un test unitaire :
    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
     
    int main (void)
    {
       /* test unitaire */
       struct test
       {
          int test;
          struct
          {
             char s[10];
          }
          in;
          struct
          {
             char const *s;
          }
          out;
       };
     
       static struct test a[] = {
    /* *INDENT-OFF* */
        {10, ""       , ""},
        {11, " "      , ""},
        {12, "  "     , ""},
     
        {20, "a"      , "a"},
        {21, " a"     , "a"},
        {22, "  a"    , "a"},
        {23, "a "     , "a"},
        {24, "a  "    , "a"},
     
        {30, "ab"     , "ab"},
        {31, "a b"    , "a b"},
        {32, " a b"   , "a b"},
        {33, "a b "   , "a b"},
        {34, " a b "  , "a b"},
     
    /* *INDENT-ON* */
       };
     
       size_t i;
     
       for (i = 0; i < sizeof a / sizeof *a; i++)
       {
          struct test *p = a + i;
          trim (p->in.s);
     
          if (strcmp (p->in.s, p->out.s) != 0)
          {
             printf ("error at test #%d\n", p->test);
             break;
          }
       }
     
       if (i == sizeof a / sizeof *a)
          puts ("P A S S E D");
       return 0;
    }
    Ca marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    P A S S E D
     
    Process returned 0 (0x0)   execution time : 0.042 s
    Press any key to continue.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    La notation hongroise incomprise (à-la-Microsoft) a encore fait des ravages...
    Heu, non. Notation perso qui me convient très bien.
    Citation Envoyé par Emmanuel Delahaye Voir le message
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
    void trim (char *P_szChaineSource)
    {
     
       char *L_szDebutCopie;
       size_t L_iLongueurCopie;
       L_szDebutCopie = P_szChaineSource;
       L_iLongueurCopie = strlen(P_szChaineSource);
       while ((L_iLongueurCopie > 0)
              && (isspace (P_szChaineSource[L_iLongueurCopie - 1])))
       {
          L_iLongueurCopie--;
       }
       if (L_iLongueurCopie > 0)
       {
          while ((L_iLongueurCopie > 0) && (isspace (*L_szDebutCopie)))
          {
             L_szDebutCopie++;
             L_iLongueurCopie--;
          }
       }
    }
    Marche pô...
    Ben oui; c'était juste un bout de code pour fournir le début et la taille de la chaîne sans espace (L_szDebutCopie, L_iLongueurCopie), ensuite à lui de faire la copie comme il l'entend!
    D'ailleurs dans l'exemple que tu donnes la chaine en entrée est altérée alors qu'il me semble que le problème à la base était pour faire une recopie de chaine.

  9. #9
    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 3DArchi Voir le message
    Ben oui; c'était juste un bout de code pour fournir le début et la taille de la chaîne sans espace (L_szDebutCopie, L_iLongueurCopie), ensuite à lui de faire la copie comme il l'entend!
    D'ailleurs dans l'exemple que tu donnes la chaine en entrée est altérée alors qu'il me semble que le problème à la base était pour faire une recopie de chaine.
    Euh si c'est le cas (et c'est la cas, OK), je ne vois pas comment tu alloues l'espace pour la copie, ni comment tu retournes l'adresse de cet espace...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Euh si c'est le cas (et c'est la cas, OK), je ne vois pas comment tu alloues l'espace pour la copie, ni comment tu retournes l'adresse de cet espace...
    J'ai juste supposé que Jayceblaster saurait faire cette partie.

Discussions similaires

  1. Traitement sur une chaine de caractere
    Par emma3345 dans le forum Langage
    Réponses: 6
    Dernier message: 03/12/2007, 00h21
  2. fonction replaceFirst sur une chaine de caractere
    Par marcxa44 dans le forum Langage
    Réponses: 1
    Dernier message: 08/10/2007, 14h22
  3. Conditions sur une chaine de caractères
    Par xenos dans le forum Delphi
    Réponses: 2
    Dernier message: 21/05/2006, 23h56
  4. fread sur une chaine de caractere ?
    Par Battosaiii dans le forum C
    Réponses: 17
    Dernier message: 18/03/2006, 13h50

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