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 :

Fonction getchar() ?


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2010
    Messages : 41
    Points : 22
    Points
    22
    Par défaut Fonction getchar() ?
    Bonsoir,

    j'ai un problème avec la fonction getchar(), avec le code ci-dessous :

    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
     
    char car = '\0';
    for(;;)
    {
    	car = '\0';
     
    	car = getchar();
     
    	if( car == 'a' )
    	{
    		printf( "On a quelque chose\n");
    	}
    	else if( car == 'b'  )
    	{
    		printf( "On a autre chose\n" );
    	}
    	else
    	{
    		printf( "Encore autre chose\n");
    	}		
    }
    Je veux donc avoir ce code en boucle (avec le for), mais voilà, lorsque je tape le caractère 'a' par exemple, il va bien m'écrire "On a quelque chose", mais bizarrement, lorsqu'il refait la boucle, il passe le getchar() sans attendre que je tape quoi que ce soit au clavier et va aller dans le "else". En gros, il fait des boucles 2 par 2, et je ne comprends pas pourquoi. Pourtant, j'ai testé le caractère "car" en affichant son contenu, et je n'ai pas de retour à la ligne comme je le réinitialise à chaque fois, alors je ne vois vraiment pas d'où ça peut venir...
    Par contre, j'ai aussi essayé avec scanf, ça me fait la même chose...

    Des idées d'où le problème pourrait venir ?

    Merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,



    Une boucle de lecture doit faire dans cet ordre :
    - lecture
    - vérification
    - traitement de la donnée lue

    Or tu ne fait pas la phase de vérification.
    Regarde le man et tu verras que getchar envois un int.

    comme je le réinitialise à chaque fois
    ie ?
    est totalement inutile, je ne vois pas à quoi il sert.

    Sinon, le '\n' est bien mis dans car lors de la deuxième boucle...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    pardon si je me trompe mais (et surtout si j'ai pas le droit d'interagir)

    mais getchar() sert à saisir des lignes de caracteres. Il extrait les caracteres un à un.

    Donc quand tu tap au clavier sa met dans le burffer = "a\0". donc dans le buffer il ya deux caracteres.
    lors de la premiere iteration tu teste donc le caractere 'a' mais lors de la deuxieme tu extrait le caractere '\0'('\0' ou encore '\n' sont considerer comme caractere de terminaison).

    donc voila .... ha oui le getchar() attend pas une saisie au clavier .... parce que dans le buffer il y'a deja un caractere ....

    un conseil utilise un IDE disposant d'un debugger qui gert le pas à pas .. et apprend le à l'utiliser.

  4. #4
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    pardon si je me trompe mais (et surtout si j'ai pas le droit d'interagir)
    C'est pas encore une dictature ici.

    getchar() comme son nom l'indique récupère un caractère.
    Or \0 est un caractère donc stocker deux caractères dans un seul char cela serait pas malin.

    getchar() ne récupère donc aucun \0 car c'est le caractère de fin d'une chaîne de caractères.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  5. #5
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Si tu veux récupérer caractère par caractère au lieu de buffériser jusqu'à un retour chariot, c'est la fonction getch() de la lib conio sous windows ou curses sous linux qu'il te faut... Donc un peu de code en plus pour être multiplateformes. Tu as même la fonction kbhit() qui te permet de t'affranchir du côté bloquant de getch(). Très utile si tu veux écrire une appli autour d'une finite state machine et gérer toi même la saisie de l'utilisateur.

    A+

    Pfeuh

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par transgohan Voir le message
    getchar() comme son nom l'indique récupère un caractère.
    Or \0 est un caractère donc stocker deux caractères dans un seul char cela serait pas malin.

    chaîne de caractères.
    c'est pas du tout ce que j'ai dit.
    Getchar() (qui est different à getch) Extrait le PREMIER caractere Present dans le Buffer de l'entree standard !!!!!
    donc
    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
     
    char car = '\0';// car est bien initialiser à '\0'
    for(;
    {
    car = '\0'; /// heu pk le refaire une deuxieme fois??
     
    car = getchar(); // ici getchar attend quelque chose dans le buffer et le 
                          //stockera dans la variable car
     
    if( car == 'a' )
    {
    printf( "On a quelque chose\n");
    }
    else if( car == 'b' )
    {
    printf( "On a autre chose\n" );
    }
    else
    {
    printf( "Encore autre chose\n");
    }
    }
    et oui il s'arretera au caractere de terminaison (caractere de termaison ... veux dire caractere de fin d'une chaine de carcatere ....comme tu dis)

    Mais apres l'avoir teste!!!!! --- c'est pour sa qu il n'est pas du tout à la saisie
    d'un caractère comme un choix de menu par exemple.

    fait le au debugger ... quand j'ai un doute je le fait .... et grace au spy de VS on le voit clairement !!!!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2010
    Messages : 41
    Points : 22
    Points
    22
    Par défaut
    Merci pour vos réponses.
    J'ai réussi à magouiller quelque chose pour que ça marche

    Neckara > Il me semblait bien que y'avait des balises pour le code, mais je l'ai pas trouvé sur le coup. C'est corrigé

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Pense à le taguer comme resolut alors...

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 4
    Dernier message: 05/01/2011, 19h37
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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