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 :

Chaine, et "\n"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Par défaut Chaine, et "\n"
    Bonjour,

    j'essai de lire une chaine de caractere à partir d'un fichier avec la fonction fgets,
    jusque là, tout marche bien.

    le probleme est que quand j'affiche cette chaine de caractere il y a un retour chario à la fin, et ca me gene pour le formatage de celle-ci

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf (stdout, "%s grammes.", maChaine);
    merci !

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Bein oui, fgets met le \n dans le buffer
    T'as plus qu'a l'enlever à la main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    assert(strlen(buff) > 0 && buff[strlen(buff) - 1] == '\n');
     
    buff[strlen(buff) - 1] = '\0';
    Edit : l'instruction ci dessus n'est correcte que dans le cas où fgets a bel et bien mis un \n dans le buffer (c'est pas le cas pour la derniere ligne lue)

  3. #3
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Par défaut
    oh, merci

    j'etais en train de me casser la tete, a faire ce que tu as fais en une ligne ... lol

  4. #4
    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 Gruik
    Edit : l'instruction ci dessus n'est correcte que dans le cas où fgets a bel et bien mis un \n dans le buffer (c'est pas le cas pour la derniere ligne lue)

    Ou si buff est trop petit pour la ligne lue. Cette méthode simpliste est incorrecte. Ne pas l'utiliser.

  5. #5
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static void search(char *chaine)
    {
        char *p = strchr(chaine, '\n');
     
        if (p)
        {
            *p = 0;
        }
    }
    pourquoi une fonction static ?

  6. #6
    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 sahid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static void search(char *chaine)
    {
        char *p = strchr(chaine, '\n');
     
        if (p)
        {
            *p = 0;
        }
    }
    pourquoi une fonction static ?
    Pourquoi pas ! Si elle n'est pas exportée, static, sinon, on la met dans un fichier séparé, on crée un header avec un prototype séparé... procédure habituelle que je recommande. On peut même aller plus loin en la mettant dans sa bibliothèque personnelle...

    Mais cette technique n'est pas formidable. Il faut au moins profiter du fait qu'on a détecté le '\n' ou non pour retourner cette information, car il peut y avoir des traitements conséquents à faire...

    Je fais plutôt comme ceci :
    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
     
    #include <string.h>
     
    static int search (char *chaine)
    {
       int found = 0;
        char *p = strchr(chaine, '\n');
     
        if (p != NULL)
        {
            *p = 0;
            found = 1;
        }
       return found;
    }

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par Emmanuel Delahaye

    Ou si buff est trop petit pour la ligne lue. Cette méthode simpliste est incorrecte. Ne pas l'utiliser.
    C'était qu'une heuristique pour repondre au probleme posé qui était "y a un \n genant en fin de chaine"

  8. #8
    Membre expérimenté
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Par défaut
    tout marche bien,

    par contre j'ai un warning, au niveau du strlen ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    main.c:66: warning: incompatible implicit declaration of built-in function ‘strlen’
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void
    nettoie_chaine (char *chaine)
    {
      chaine[strlen (chaine) - 1] = '\0';
    }
    il y a un moyen de faire quelque chose ?

  9. #9
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    #include <string.h>

  10. #10
    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 sahid
    tout marche bien,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void
    nettoie_chaine (char *chaine)
    {
      chaine[strlen (chaine) - 1] = '\0';
    }
    il y a un moyen de faire quelque chose ?
    Je t'ai indiqué une méthode correcte. Celle-ci est incorrecte. Il faut tester la présence du \n avant de le retirer, sinon, on vire un caractère utile...

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

Discussions similaires

  1. Chaine de caractere avec quote
    Par mactwist69 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 11/07/2008, 17h19
  2. Réponses: 3
    Dernier message: 08/06/2007, 14h16

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