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 :

[problème] affichage de chaines


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 256
    Points : 75
    Points
    75
    Par défaut [problème] affichage de chaines
    Bonjour,


    je voudrais savoir pourquoi il faut obligatoirement exécuter un getchar(); après avoir utilisé un certain nombre de scanf ou de gets??
    Car à l'execution de mon prog , j'ai un problème d'affichage de chaînes de caractères.
    Mon prof de C me parlait de buffer... je n'ai pas trop compris.



    sincèrement;

  2. #2
    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 Re: [problème] affichage de chaines
    Citation Envoyé par 123quatre
    Bonjour,


    je voudrais savoir pourquoi il faut obligatoirement executer un getchar(); après avoir utilisé un certains nombre de scanf ou de gets??
    Car à l'execution de mon prog , j'ai un problème d'affichage de chaînes de caractères.
    Mon prof de C me parlait de buffer... je n'ai pas trop compris.



    sincèrement;
    Ben avec scanf lorsque tu rentre ton caractere et que tu appui sur Entrée, le \n du au entrée est plac é dans un buffer. Si tu ne fais pas un getchar lors du prochain scanf(%c...), le caractere sera directement pris dans le buffer tu ne pourra pas taper ton caractere.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 256
    Points : 75
    Points
    75
    Par défaut
    doit-on tout de suite faire suivre un scanf ou un gets d'un getchar()? (le getchar(); vide le buffer?)

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Non.

    En fait, tu dois toujours faire suivre un gets() d'une erreur fatale. Car le fait d'utiliser gets() lui-même en est une.

    scanf() est très difficile à utiliser correctement, et déconseillé aux débutants.

    Pour saisir du texte au clavier, il faut utiliser fgets(). Ensuite, si la chaîne obtenue avec fgets() ne contient pas de caractère \n, c'est qu'il reste une partie de la ligne dans le buffer clavier. Pour le vider, il faut faire la boucle de getchar() jusqu'à ce qu'on ait récupéré le \n ou qu'on soit arrivé à la fin complète du buffer (EOF)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 256
    Points : 75
    Points
    75
    Par défaut
    c'est un peu compliqué pour moi ce que vous dites Médinoc.
    Pourriez vous me réexpliquer la dernière phrase de votre post?

    merci !

  6. #6
    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 : 68
    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 Re: [problème] affichage de chaines
    Citation Envoyé par 123quatre
    je voudrais savoir pourquoi il faut obligatoirement exécuter un getchar(); après avoir utilisé un certain nombre de scanf ou de gets??
    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 256
    Points : 75
    Points
    75
    Par défaut
    Merci pour vos réponses !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 256
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    malgre l'utilisation de fgets() je rencontre toujours le même problème, voici mon code (à tester pour voir l'erreur):


    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
    #include <stdio.h>
     
     
     
    struct Pret
    {
        char prete;
        char aqui[20];
        char quand[10];
    } pret;
     
     
    struct Livre
    {
        char nom[20];
        char auteur[20];
        char edition[20];
        struct Pret pret;
    } livre;
     
     
    int main()
    {
     
            printf("Entrez le nom du livre: ");
    	fgets(livre.nom, sizeof livre.nom, stdin);
     
    	printf("Entrez l'auteur du livre: ");
    	fgets(livre.auteur, sizeof livre.auteur, stdin);
     
            printf("Entrez l'edition du livre: ");
            fgets(livre.edition, sizeof livre.edition, stdin);
     
            printf("Le livre est-il prete?[O] ou [N]: ");
            livre.pret.prete=fgetc(stdin);
     
    	if(livre.pret.prete=='O'){
    	    printf("A qui le livre est-il prete? ");
    	    fgets(livre.pret.aqui, sizeof livre.pret.aqui, stdin);
    	    printf("Quand?(jj-mm-aa) ");
    	    fgets(livre.pret.quand, sizeof livre.pret.quand, stdin);
                                  }
     
    	return 0;
     
     
    }

  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 : 68
    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 123quatre
    malgre l'utilisation de fgets()
    As-tu bien lu mes articles ? As-tu bien pris conscience que fgets() capte aussi le '\n' final ? Parce que je ne vois aucun traitement en ce sens dans ton code... De même, un éventuel débordement n'est pas traité. Il te manquait peut être ceci :

    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Sinon, quel est le problème exactement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Entrez le nom du livre: aaaa
    Entrez l'auteur du livre: bbbb
    Entrez l'edition du livre: cccc
    Le livre est-il prete?[O] ou [N]: n
    Montre une exécution posant problème.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 256
    Points : 75
    Points
    75
    Par défaut
    J'ai bien fait l'effort de lire votre article, il se peut que j'ai mal compris ce que j'ai lu alors.

    Le problème à l'exécution est que les deux dernières questions (du if) s'emballent:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Entrez le nom du livre: aaaa
    Entrez l'auteur du livre: bbbb
    Entrez l'edition du livre: cccc
    Le livre est-il prete?[O] ou [N]: O
    A qui le livre est-il prete?Quand?(jj-mm-aa)

  11. #11
    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 : 68
    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 123quatre
    J'ai bien fait l'effort de lire votre article, il se peut que j'ai mal compris ce que j'ai lu alors.

    Le problème à l'exécution est que les deux dernières questions (du if) s'emballent:
    Ok, Dans ton code, il y a un fgetc().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            livre.pret.prete=fgetc(stdin);
    Dans mon article

    http://emmanuel-delahaye.developpez....tes.htm#saisie

    il y a écrit :
    fgetc(), getc(), getchar()

    Ces trois fonctions extraient un caractère du flux entrant (pour getchar(), ce flux est stdin). C'est insuffisant pour saisir autre chose qu'un simple <ENTER>. Ces fonctions ne sont absolument pas adaptées à la saisie d'un caractère comme un choix de menu par exemple.
    Quels sont les mots que tu ne comprends pas ?

  12. #12
    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
    Apres le fgetc il faut que tu vides le buffer avec une boucle et un getchar() voir le site d'Emmanuel

  13. #13
    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 : 68
    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 Skyrunner
    Apres le fgetc il faut que tu vides le buffer avec une boucle et un getchar() voir le site d'Emmanuel
    Compliqué. Il faut surtout utiliser fgets()...

Discussions similaires

  1. Problème affichage chaine russe D6 -> DXE3
    Par pepito62 dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2013, 14h02
  2. Problème affichage d'une liste chainée
    Par Nardjesse dans le forum Débuter
    Réponses: 8
    Dernier message: 06/01/2013, 12h51
  3. Réponses: 15
    Dernier message: 11/09/2007, 19h36
  4. Problème saisie et affichage de chaine
    Par sam.fet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/08/2006, 18h18
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 14h31

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