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 :

Supprimer les retours à la ligne dans une chaine


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut Supprimer les retours à la ligne dans une chaine
    J'ai declaré une chaine de caractere par :

    char line[256];

    Cette chaine est censée s'écrire dans un fichier mais le problème c'est que celle-ci est constitué de plusieurs sous-chaines concaténées par strcat(). Certaines de ces sous-chaines comprennent des retours à la ligne.

    La chaine line est censé etre écrite dans un fichier. Malheureusement cette chaine contient des retours a la ligne. Donc lorsque j'ecris celle-ci dans mon fichier je me retrouve avec plusieurs lignes dans celui-ci. Alors que je veux que la chaine line soit écrite sous la forme d'une seule ligne dans mon fichier.

    Je souhaiterais donc savoir comment supprimer tous les retours à la ligne de ma chaine.

    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut
    Désolé pour le dérangement...il suffit que je poste pour arriver ensuite à mes fins de moi meme... je ne supprime pas mon topic mais préfère laisser la solution au cas ou certains seraient interessés :

    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
     
    char *Trim (char *str)
    {
          char *ibuf, *obuf;
     
          if (str)
          {
                for (ibuf = obuf = str ; *ibuf; )
                {
                      while (*ibuf && ((isspace (*ibuf)) || (*ibuf == '"')))
                            ibuf++;
                      if (*ibuf && (obuf != str))
                            *(obuf++) = ' ';
                      while (*ibuf && (!isspace (*ibuf)))
                            *(obuf++) = *(ibuf++);
                }
                *obuf = '\0';
          }
          return (str);
    }

  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
    C'est simple comme bonjour... ou presque

    Tu utilise strchr en boucle à la recherche d'un caractère '\n', dès que tu en trouves un, tu le remplace par exemple par un espace, 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
    22
    23
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main (void)
    {
       char str [] = "Une ligne, \nDeux lignes..., \nTrois lignes !";
       char * p = NULL;
     
     
       printf ("Avant:\n%s\n\n", str);
     
       while ((p = strchr (str, '\n')) != NULL)
       {
          *p++ = ' ';
       }
     
       printf ("Apres:\n%s\n", str);
     
     
       return EXIT_SUCCESS;
    }
    Résultat à la sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Avant:
    Une ligne, 
    Deux lignes..., 
    Trois lignes !
     
    Apres:
    Une ligne,  Deux lignes...,  Trois lignes !
     
    Press ENTER to continue.
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je pense que tu devrais soit utiliser strncat si toute tes chaines ont un '\n' à la fin et mettre la taille (n-1) de ta chaine en paramètre, soit copier toute ta chaine finale dans une autre chaine en ignorant les '\n'.
    Mais supprimer les '\n'sur ta chaine déjà créée, je crois pas que ce soit possible.

  5. #5
    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 juve1897
    Mais supprimer les '\n'sur ta chaine déjà créée, je crois pas que ce soit possible.
    Bin pourquoi on ne pourrais pas ? Voir mon code plus haut.
    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 !

  6. #6
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Effectivement, je n'ai pas été très malin, je n'avais pas pensé à cela.
    C'est beaucoup plus simple ainsi.

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Tu peux aussi décaler ta chaine chaque fois que tu trouves un \n

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void shift_left(char *string)
    {
        size_t i = 0;
     
        for(i = 0; i < strlen(string); i++)
        {
            string[i] = string[i+1];
        }
    }
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    euh.. Skyrunner t'a été trop vite...

    Mais sinon bien sûr l'autre solution (en dehors de celle de Franck.h) est comme l'a mentionné juve de le faire au moment du strcat..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( chaine[strlen(chaine)-1] == '\n' )
       strcat ( &(chaine[strlen(chaine)-1]), Chaine2 );
    else
       strcat ( chaine, Chaine2 );
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je n'ai pas bien compris ta fonction.
    J'ai l'impression qu'elle fais bien un décalage vers la gauche, mais que le premier élément est perdu et que '\n' est toujours là.

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Franck.H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       while ((p = strchr (str, '\n')) != NULL)
       {
          *p++ = ' ';
       }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    p = str;
    while ((p = strchr(p, '\n') != NULL) 
    {
       *p++ = ' ';
    }
    Je sais bien que les optimisations prematurees sont a eviter, mais faire du n^2 quand du n est aussi simple...
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    non ce qu'il veut faire c'est chaque fois que tu trouves le '\n', au lieu de l'enelver comme on a montré plus haut, il décale ce qui reste de la chaine de 1 cran, en écrasant donc le '\n'.

    Mais c'est nettement plus long que les 2 autres méthodes..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    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 Jean-Marc.Bourguet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    p = str;
    while ((p = strchr(p, '\n') != NULL) 
    {
       *p++ = ' ';
    }
    Je sais bien que les optimisations prematurees sont a eviter, mais faire du n^2 quand du n est aussi simple...
    Et c'est censé changer quoi ? Je vois pas trop en fait
    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 !

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Je sais bien que les optimisations prematurees sont a eviter, mais faire du n^2 quand du n est aussi simple...

    ou as-tu vu du n^2 ??

    strchr est linéaire... et reviens à faire la boucle à travers les caractères...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Franck.H
    Et c'est censé changer quoi ? Je vois pas trop en fait
    juste que tu redémarres à zéro à chaque fois car tu avais gardé l'adresse du debut de la chaîne.

    tu avais raison Jean-Marc désolé
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  15. #15
    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
    A ouais c'est pas faux, j'avais pas vu ca J'ai rien dit Jean-Marc
    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 !

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut
    Je pense m'être un peu compliqué la vie avec mon code...

    Merci à tous pour votre aide. Cela dit la fonction que j'ai noté plus haut ne fait pas que supprimer les retours à la ligne et comme j'aurais besoins d'elles plus tard autant l'utiliser pour supprimer les retour à la ligne même si elle fait plus que ca.

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par souviron34
    ou as-tu vu du n^2 ??

    strchr est linéaire... et reviens à faire la boucle à travers les caractères...
    Oui. Et appele dans une boucle ou on va passer un nombre de fois proportionnel a la longueur de la chaine (hypothese vraissemblable), on un a comportement quadratique (1+2+3+...n, c'est du quadratique).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  18. #18
    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
    La solution de Franck.H est simple mais a l'inconvénient de ne pas supprimer mais de remplacer le '\n' et donc de modifier la ligne (mais peut être que ce n'est pas important dans ce cas).
    Si on veutsupprimer les '\n' sur la ligne finale, il faut décaler les 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
    void SupprimerRC( char* chaine)
    {
       char * lire = chaine;
       while(*lire != '\0')
       {
          while(*lire == '\n') lire++;
          *chaine = *lire;
          if(*lire != '\0')
          {
             chaine ++;
             lire++;
          }
       }
       *chaine = '\0';
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  19. #19
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    C'est pour ça que j'ai proposé une fonction qui décale vers la gauche.

    Dès que tu trouves un \n tu décales à partir de cette position.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene
    La solution de Franck.H est simple mais a l'inconvénient de ne pas supprimer mais de remplacer le '\n' et donc de modifier la ligne ...
    ???

    parce que le fait de décaler ne modifie pas la ligne ???
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Supprimer les ecart de ligne dans une richtextbox
    Par Nikogram dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 18/12/2009, 14h34
  2. enlever les retours à la ligne dans une chaîne ?
    Par Sefrou dans le forum VBA Access
    Réponses: 1
    Dernier message: 20/11/2009, 20h21
  3. Réponses: 8
    Dernier message: 03/11/2008, 15h50
  4. expression regulières supprimer les doublons de caratéres dans une chaine
    Par karimphp dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/12/2007, 14h26
  5. [VB.NET] Enlever les retours à la ligne dans une string
    Par adrix26 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/01/2007, 23h27

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