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 :

Attente d'un caractère


Sujet :

C

  1. #1
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut Attente d'un caractère
    Bonjour à tous,

    me voila devant un nouveau problème alors je fais appel à vous =)
    Il y a quelque temps je suis passé sous Linux et je sais que certaines fonctions ne marchent pas.

    Je n'arrive pas à faire une attente de caractère comme je le faisais sous Windows avec getch();

    Je me suis renseigné (vous inquiètez pas ) et sous Linux il y a soit getc(); ou la macro getchar(); je les ai essayer toutes les 2 et ca ne marche pas... J'ai aussi essayer avec scanf() et je ne sais pas pourquoi il ne s'arrete pas, ca doit etre a cause de mon code.

    Je ne vais pas poster mon code, mais un meme exemple simplifié :

    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
     
     
    include...
     
    void aide(void);
     
    int main(void){
    char c;
    scanf("%c",&c);
    switch(c){
     
                  case ('a'):
                        aide();
                        break;
                  case ('q' || 'Q'):// <=== Erreur de compilation sous cette forme /probleme 2\
                         quit();
                         break;
                  default:
                         printf("erreur");
                         getchar() // ou getc(); ou scanf <=== Problème 1 ne s'arrete pas
     
                  }
    }
     
    void aide(void){
     
                ... // Affichage de l'aide avec des printf
     
    getchar() // ou getc ou encore un scanf <========= Ne s'arrete pas /Problème 1\
     
    }
    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389

  3. #3
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Dans le mode normal (cooked), on saisit la ligne tranquillement, avec possibilité de l'éditer avec Backspace, avant de l'envoyer en enfonçant Entrée.
    Ce mode là ne me dérange absolument pas.
    Mon problème est que quoi que je fasse le programme passe à l'instruction suivante sans prendre garde au getchar() ou quoi que ce soit.
    Néanmoins je viens quand même d'essayer de passer en mode_raw le temps d'un getchar() et ca ne marche pas non plus.

    Merci quand même.

    PS : Inutile de me casser a grand coup de FAC, j'ai essayer de trouver la solution par moi même avant tout.

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Désolé j'ai encore mal compris ton problème (2ème fois dans la journée ). Bin c'est long à expliquer mais en gros après ton premier scanf ou getchar ou getc (au début de main) tu dois vider le buffer de stdin. Si tu veux en connaître la raisons => [Tutoriel] Les entrées/sorties en langage C.

  5. #5
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Pas de soucis même si ca m'a un peu enragé Ca faisait vraiment, raaah encore un petit nouveau, ils savent pas consulter les FAC. Ils croyent qu'on se casse les couilles à écrire ça pour qui ?? =P

    Je vais plutot me diriger vers le tutorial, j'aime comprendre ^^.

    Sinon j'avais une 2ème question qui n'étais pas vraiment en rapport à propos du switch : on ne peut pas faire case ( 'a' || 'A') ?

    Voila merci

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Trademark Voir le message
    Sinon j'avais une 2ème question qui n'étais pas vraiment en rapport à propos du switch : on ne peut pas faire case ( "a" || "A") ?
    Il suffit de mettre plusieurs case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int c = getchar();
     
    switch(c) {
      case 'A':
      case 'a':
         /* faire des choses*/
        break;
       ....
    }

  7. #7
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Humm ^^ ca marche pas :s, limite pour que ca marche il faudrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int c = getchar();
     
    switch(c) {
      case 'A':
         /* faire des choses */
      case 'a':
         /* faire la même chose que en 'A' */
        break;
       ....
    }
    Mais c'est vraiment horrible d'écrire ça comme ca... Autres solutions ?

    Sinon j'ai vu que tu as utilisé getchar();
    Pour ma part on nous a toujours appris a utiliser scanf();
    Donc j'aimerais savoir les avantages/inconvénients de l'un et de l'autre s'il vous plait

    Merci

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Impossible que cela marche pas. Je vais utiliser des entiers pour que ça soit plus clair mais ça reste valable pour n'importe quel type.
    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
    int n;
    ...
    switch(n)
    {
    case (1 || 2) :
        /*
        Exécuté si n vaut (1 || 2). Or (1 || 2) vaut (VRAI || VRAI) car :
        En C, tout ce qui n'est pas nul vaut VRAI.
        Comme (VRAI || VRAI) vaut VRAI, (1 || 2) vaut VRAI et :
        En C, en sortie, VRAI vaut 1.
        Donc ici, c'est en fait le case 1 :
        */
        break; /* L'instruction break; permet de sortir d'un switch */
     
    case 3 : /* Se brancher ici si n == 3 */
    case 4 : /* Se brancher ici si n == 4 */
        /* Si on se retrouve ici, c'est que n == 3 ou que n == 4. */
        break; /* Pour quitter le switch. */
    }
    Sinon j'ai vu que tu as utilisé getchar();
    Pour ma part on nous a toujours appris a utiliser scanf();
    Donc j'aimerais savoir les avantages/inconvénients de l'un et de l'autre s'il vous plait
    getchar est la fonction élémentaire pour lire un caractère. Quand tu fais scanf("%c", &x); scanf va appeler getchar et si la lecture a réussi, va placer le caractère lu dans x et enfin, retourne une valeur permettant de connaître si l'opération a réussi ou non. scanf est une fonction utile, mais écrire scanf("%c", &x) a peu d'intérêt. C'est plus lent qu'un getchar à cause de l'appel à getchar plus les tests que scanf doit faire, etc.

  9. #9
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Je ne sais pas pourquoi mais ('a' || 'A') ne marche toujours pas, enfin l'autre marche et ca c'est bien

    Merci pour vos réponses

    Bye bye

  10. #10
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    En supposant que t'es sous Windows, Linux ou Mac OS X (et la liste ne s'arrête pas là), les codes de caractères 'A' et 'a' sont respectivement 65 et 97. La valeur de ('A' || 'a') est donc 1.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Attente de saisie d'un caractère
    Par richard_sraing dans le forum C
    Réponses: 4
    Dernier message: 04/02/2007, 12h24
  3. [Choix] Quelles attentes par rapport aux SGBD ?
    Par thierry34 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 13/07/2002, 20h08
  4. Adresse des polices de caractères dans la RAM video ?
    Par Anonymous dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 27/05/2002, 17h29
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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