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 :

getchar()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 29
    Par défaut getchar()
    bonjouuur,

    printf("Tapez sur une touche pour continuer...");
    getchar();

    je veux quitter un ecran en appuyant sur une touche quelconque.
    mais ca marche pas!!
    je travaille sous linux avec le compilateur C gcc
    sous windows un system("PAUSE"); marche tres bien.
    merci

  2. #2
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 3
    Par défaut
    J'ai pas de linux, mais ca marche sous windows et ca devrait marcher sous linux.

    Quand tu dis que ca marche pas, tu sors tout de suite de la fonction ou ca compile pas du tout ou tu as une erreur a l'execution?

  3. #3
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Tu as essayé avec
    Juste pour voir.
    Je ne suis pas sur, pas tésté.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 22
    Par défaut
    system("PAUSE"); est pas portable
    et
    getch() marche sous linux avec la lib <conio.h>

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    getchar n'attendrait-il pas la validation par la touche ENTREE ? Si c'est ton probleme et que tu souhaite que ca fonctionne quelque soit la touche appuyer, sache qu'il n'existe pas de solution a 100% protable.

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    En fait, sous unix/linux, la fonction getch() de conio.h n'existe pas.
    Elle est présente dans la librairie curses (ncurses sous linux) mais neccessite une gestion plus complexe du terminal...

    Pour pouvoir effectuer un getch() sans la librairie curses, il faut modifier certaines propriété du terminal.

    Voici un exemple de code d'une fonction getch() pour unix/linux:


    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
    #include <stdio.h>
    #include <termios.h>
     
    int l_getch ()
    {
            static struct termios term, back;
            int ret=-1;
     
            tcgetattr (0, &term);   	/* On recupere les info du terminal */
            memcpy (&back, &term, sizeof(term));
     
            term.c_lflag &= ~(ICANON|ECHO);	/* On modifie les options du terminal */
            term.c_cc[VTIME] = 0;   	/* Temps d'attente infini */
            term.c_cc[VMIN]  = 1;   	/* Nombre minimun de caractere */
     
            tcsetattr(0, TCSANOW, &term);   /* Modif des attribut de stdin */
            ret = getchar();                /* Attente d'un caractere */
            tcsetattr(0, TCSANOW, &back);   /* Restauration des attributs */
     
            return ret;
    }
     
    int main(void)
    {
     
            printf ("Appuyer sur une touche...\n\n");
            printf ("Vous avez appuyer sur la touche '%c'...\n\n", l_getch ());
            return 0;
    }

    Explication:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static struct termios term, back;
    Il s'agit de la structure contenant les propriétées du terminal.
    La variables est mise en static parceque sinon cela peut poser des problèmes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tcgetattr (0, &term);
    memcpy (&back, &term, sizeof(term));
    tcgetattr() permet de recuperer les informations du terminal.
    Ici on recupere les infos du terminal pour stdin ( 0 ) et on les met dans term...
    Ensuite on fait une copie de sauvegarde du terminal dans back...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    term.c_lflag &= ~(ICANON|ECHO);	/* On modifie les options du terminal */
    Ici on modifie des propriétées du terminal.
    c_lflag est un int (il me semble) et chaqun de ses bits corresponds a une propriété.
    Cette ligne permet d'enlever les propriétés ICANON et ECHO.
    ICANON gere la saisie des caractères.
    ECHO affiche l'echo des caractères saisie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    term.c_cc[VTIME] = 0;   	/* Temps d'attente infini */
    term.c_cc[VMIN]  = 1;   	/* Nombre minimun de caractere */
    Ici on modifie deux autres propriété, le c_cc[VTIME] permet d'indiquer un temps d'attente (en dixième de seconde) avant de quitter la fonction de lecture. Ici on attendra indéfiniments...
    c_cc[VMIN] permet d'indiquer le nombre de caractères minimum qui doivent être saisie avant de retourner une valeur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tcsetattr(0, TCSANOW, &term);   /* Modif des attribut de stdin */
    ret = getchar();                /* Attente d'un caractere */
    tcsetattr(0, TCSANOW, &back);   /* Restauration des attributs */
    Enfin on met a jour le terminal avec les nouveaux attributs...
    On lit un caracteres
    Et on restaure les attribut original du terminal...

    Attention, si vous ne restaurer pas les attributs du terminal, cela provoquera des changements dans toutes les fonctions de lecture sur stdin (read(), getchar()...).

    Pour ceux qui veulent plus de détail, jeter un coups d'oeil à la page de manuel de termio ou faite une recherche sur google avec uconio.h (il y a eu plusieur 'portage' de conio.h sous unix/linux...

    Et si voulez plus de détail sur mon code n'hésiter pas

    a++

  7. #7
    Invité
    Invité(e)
    Par défaut
    essaie ca sous linux
    c un bidouillage mais ca peut marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h> 
    #include <pwd.h> 
    int main(int argc, char ** argv) 
    { 
    char * prompt="Appuyez entree"; 
    char * lePass;
    lePass = (char*)getpass(prompt); 
    return 0; 
    }
    normalement getpass sert a recuperer un mot de passe (sous systeme unix uniquement)
    ce qui va se passer : ton programme va afficher Appuyez sur une entree
    si tu appuies sur n'importe kelle touche ca fera rien
    si tu appuies sur entrée ca marchera

  8. #8
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    C'est quoi tout ca ....???? getchar() marche sous Linux ainsi que getch() (en tout ca chez moi)

    Mais sinon, il fait system("PAUSE") ; (marche aussi chez moi) .

    Nas'

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NASKY
    C'est quoi tout ca ....???? getchar() marche sous Linux ainsi que getch() (en tout ca chez moi)
    getchar() marche sous linux...
    Mais par defaut getchar() est bloquant et attend une validation de la ligne par ENTREE.

    Quand à getch(), il existe sous linux dans la librairie ncurses.
    Mais il ne correspond pas au getch() de windows (conio.h) car il oblige a gérer le terminal.
    Il existe toutefois une librairie non-standard uconio qui correspond à un portage sous unix/linux du conio.h de windows.

    Mais sinon, il fait system("PAUSE") ; (marche aussi chez moi) .

    Nas'
    system("PAUSE"); ne devrait pas marcher.
    Le programme PAUSE n'existe pas sous linux.

    a++

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    désolé de remonter ce vieux sujet, mais il convenait exactement à ce que je voulais.

    A un petit point près : dans le code d'adiGuba, on peut lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include <termios.h>
     
    int l_getch ()
    {
            static struct termios term, back;
            int ret=-1;
    Quel est l'intéret du "static" ici ?

    Sinon, merci bien pour ce bout de code
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Ca fait longtemps ca ! Et je dois avouer que je ne m'en souvient plus du tout de la raison exacte

    Je pense que cela doit venir de la méthode tcsetattr() qui ne copie pas la structure mais qui conserve seulement l'adresse (et donc à la fin de la méthode la variable serait désallouer si elle n'était pas static, ce qui pourrait provoquer un bug). Mais je n'en suis pas du tout sûr...

    Sinon la seconde solution c'est que j'ai dit une connerie (c'est vrai j'étais jeune et innocent à l'époque )

    a++

  12. #12
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par adiGuba
    Je pense que cela doit venir de la méthode tcsetattr() qui ne copie pas la structure mais qui conserve seulement l'adresse (et donc à la fin de la méthode la variable serait désallouer si elle n'était pas static, ce qui pourrait provoquer un bug). Mais je n'en suis pas du tout sûr...
    je ne sais pas si la validité de l'adresse est garantie en en dehors de la fonction, un malloc serait plus sûr.

    Citation Envoyé par adiGuba
    Sinon la seconde solution c'est que j'ai dit une connerie
    ça me semble une bonne solution ça

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

Discussions similaires

  1. getchar.
    Par skelletons dans le forum C
    Réponses: 2
    Dernier message: 01/04/2006, 18h37
  2. [debutant]getchar()
    Par Treuze dans le forum C
    Réponses: 11
    Dernier message: 05/01/2006, 18h16
  3. Probleme de getchar
    Par nonaM1982 dans le forum C
    Réponses: 2
    Dernier message: 13/12/2005, 22h27
  4. getchar
    Par molesqualeux dans le forum C
    Réponses: 16
    Dernier message: 07/11/2005, 10h36
  5. Réponses: 8
    Dernier message: 03/07/2004, 12h53

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