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 avec kbhit()


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut Problème avec kbhit()
    bonsoir tous le monde,
    j'aimerai pouvoir utilise la fonction clreol() que quand la personne saisie la premiere lettre d'un scanf, c'est pour modifie le contenu d'une variable apres avoir ete affiche et supprime de l'ecran.
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	 gotoxy(13,27);
    	 printf("Prénom                 :");
    	 gotoxy(41,27);
    	 printf("%s",prenom);
    	 gotoxy(41,27);clreol(); 
    	 gets(prenom);
    mais quand j'utilise ce code j'ai pas le temps de voir ce qui est affiche dans le deuxieme printf .
    merci d'avance

  2. #2
    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 : 67
    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 djinpark1 Voir le message
    mais quand j'utilise ce code j'ai pas le temps de voir ce qui est affiche dans le deuxieme printf .
    merci d'avance
    Etant donné que tu enchaines directement affichage et effacement, c'est normal que tu ne voies rien...

    Il ne faut pas utiliser gets(), c'est un bug. Puisque tu utilises conio, il y a cgets() qui est correct, mais il faut bien lire la doc, car son utilisation est un peu tordue...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Etant donné que tu enchaines directement affichage et effacement, c'est normal que tu ne voies rien...
    merci de ta réponse mais j'avais saisie le truc , j'essaie de trouve une solution a ça , t'aurai pas une idée pour remédier a ce problème svp ?

  4. #4
    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 : 67
    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 djinpark1 Voir le message
    merci de ta réponse mais j'avais saisie le truc , j'essaie de trouve une solution a ça , t'aurai pas une idée pour remédier a ce problème svp ?
    C'est un problème d'algorithme. C'est à toi de concevoir un déroulement d'opération qui fasse ce que tu veux faire.

    Je ne sais pas ce que tu veux faire. Ce qui semble logique, c'est

    - affichage
    - saisie
    - effacement

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    ce que je veux faire c'est :

    affichage de "nom :"
    affichage de la valeur que contient la variable nom
    attente qu'une touche sois presse
    effacer la variable nom de l'écran
    enregistre le nouveau nom dans la variable nom tout en prenons en compte la touche presse avant l'effacage

    exemple :

    Nom : jean /*sera affiche au début*/
    le curseur se posera sur le j de jean
    une fois que l'utilisateur saisira la première touche du nom qui va remplace jean (par exemple : le M de martin) j'aimerai que le jean disparaisse et qu'on voit a la place m et qu'on attend la saisie de la suite du nom , et a la fin je retrouve martin a la place de jean dans la variable .

    j'ai pense a utilise getch(); mais quand j'affiche la variable après je retrouve artin .

    j'espère que c'est compréhensible ,et merci de votre aide.

  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 : 67
    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 djinpark1 Voir le message
    j'espère que c'est compréhensible ,et merci de votre aide.
    OK. J'essaye de te répondre ce weekend, pas le temps aujourd'hui, c'est assez long...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    merci beaucoup et encore désole du dérangement

  8. #8
    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 : 67
    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 djinpark1 Voir le message
    merci beaucoup et encore désole du dérangement
    Si j'ai bien compris, tu veux faire un zone de saisie avec une valeur par défaut qui est effacée dès qu'on tape quelque chose... Euh, à quoi sert la valeur par défaut ? Pourquoi pas une zone de saisie 'blanche' (vide) ?

    En standard, on pourrait faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {
       char data[128];
     
       printf ("Saisir la donnee : ");
       fgets (data, sizeof data, stdin);
       fclean(data, stdin); /* code maintes fois publié... */
       printf ("data = '%s'\n, data);
    Est-il nécessaire de faire plus compliqué ?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    non c'est bon je me contenterai de ça ^^ merci quand même

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    j'ai résolu mon problème et j'aimerai partage le code si ça intéresse quelqu'un
    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
     
    #include <stdio.h>
    #include <conio.h>
     
    void main()
    {
    char text[20],i;
    clrscr();
    printf("tttttttttttttttttttt");
    gotoxy(1,1);
    for(i=0;i<20;i++)
    {
    text[i]=getch();
    printf("%c",text[i]);clreol();
    if(text[i]==13) {text[i]='\0';break;}
    }
    printf("%s",text);
    getch();
    }

  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 : 67
    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 djinpark1 Voir le message
    j'ai résolu mon problème et j'aimerai partage le code si ça intéresse quelqu'un
    Moyen....
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:9: warning: function declaration isn't a prototype
    main.c:9: warning: return type of 'main' is not `int'
    main.c: In function `main':
    main.c:16: warning: array subscript has type `char'
    main.c:17: warning: array subscript has type `char'
    main.c:18: warning: array subscript has type `char'
    main.c:18: warning: array subscript has type `char'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 6 warnings
    J'ai toujours pas compris à quoi ça servait d'afficher tous ces 't' au démarrage... En quoi ça aide l'utilisateur ? Attention à ne pas perdre son temps en gadgets inutiles....

    Tu devrais notamment passer plus de temps à écrire du code solide, parce qu'ici, tu débordes du tableau... Le 0 est en [20], or les indices valides d'un tableau de 20 vont de 0 à 19...

    Ceci est probablement plus intéressant...
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #include <stdio.h>
    #ifdef __BORLANDC__
    #include <conio.h>
    #else
    #include <conio2.h>
    #endif
     
    enum
    {
       BS = 8,
       CR = 13,
       ESC = 27,
       dummy
    };
     
    int saisie (int x, int y, char *s, int size)
    {
       int esc = 0;
       gotoxy (x, y);
     
       {
          int i;
          for (i = 0; i < size - 1; i++)
          {
             putch ('_');
          }
       }
     
       gotoxy (x, y);
       {
          int i = 0;
          int end = 0;
          while (!end)
          {
             int c = getch ();
             switch (c)
             {
             case BS:
                if (i > 0)
                {
                   cprintf ("\b_\b");
                   i--;
                }
                else
                {
                   /* BIP */
                   printf ("\a");
                }
                break;
             case CR:
                s[i] = 0;
                end = 1;
                break;
             case ESC:
                end = 1;
                esc = 1;
                break;
             default:
                if (i < size - 1)
                {
                   putch (c);
                   s[i] = c;
                   i++;
                }
                else
                {
                   /* BIP */
                   printf ("\a");
                }
             }
          }
       }
     
       return esc;
    }
     
    int main (void)
    {
       char text[20];
       clrscr ();
       int esc = saisie (20, 12, text, sizeof text);
     
       if (!esc)
       {
          gotoxy (20, 14), cprintf ("'%s'", text);
       }
       else
       {
          gotoxy (20, 14), cputs ("abandon");
       }
       return 0;
    }
    Pose des questions si tu ne comprends pas.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    désole je suis encore débutant (en cours (premiere annee) je suis encore au pointeur), je travaille sous turbo C , et sur ce dernier on n'affiche pas les warning, tu peux m'explique un peu ce qui cloche dans mon code ?

  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 : 67
    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 djinpark1 Voir le message
    désole je suis encore débutant (en cours (premiere annee) je suis encore au pointeur), je travaille sous turbo C , et sur ce dernier on n'affiche pas les warning, tu peux m'explique un peu ce qui cloche dans mon code ?
    Déjà, il est illisible :
    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
     
    #include <stdio.h>
    #include <conio.h>
     
    void main ()
    {
       char text[20], i;
       clrscr ();
       printf ("tttttttttttttttttttt");
       gotoxy (1, 1);
       for (i = 0; i < 20; i++)
       {
          text[i] = getch ();
          printf ("%c", text[i]);
          clreol ();
          if (text[i] == 13)
          {
             text[i] = '\0';
             break;
          }
       }
       printf ("%s", text);
       getch ();
    }
    Maintenant, on peut commenter...
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include <stdio.h>
     
    /* Sous Win32, j'utilise un portage */
    #ifdef __TURBOC__
    #include <conio.h>
    #else
    #include <conio2.h>
    #endif
     
    /*
    void main ()
     
    main() retourne int. Toujours.
    Si une fonctino n'a pas de paramètres, on le precise avec (void)
    */
    int main (void)
    {
       /*
       char text[20], i;
     
       i est de type char. Il ne peut servir d'indice.
       int ou size_t conviennent
       Eviter de melanger les definition. Une par ligne est la Bonne Pratique.
       */
       char text[20];
       int i;
     
       clrscr ();
     
       /* a quoi ca sert. Que sepasse-til si on change la taille de la chaine ? */
       printf ("tttttttttttttttttttt");
     
       gotoxy (1, 1);
     
       /* eviter les valeurs en dur. Ici, sizeof text convient
     
       on peut donc ecrire jusqu'en [19]. OK, mais le 0 final,
       on le met ou ? En cas de saturation, OK, il n'y a pas de debordement,
       mais la chaine n'est pas correcte. Le comportement est indefini.
       */
       for (i = 0; i < 20; i++)
       {
          /* pas de gestion du BS (BackSpace).
             Aucune correction possible... */
          text[i] = getch ();
     
          /*
          printf ("%c", text[i]);
     
          une facon complique et inappropriee d'ecrire
          */
          putch(text[i]);
     
          /* pourquoi effacer ce qu'on s'et casse le c*l a ecrire...
             Il y a des logiques qui m'echappent... */
          clreol ();
     
          if (text[i] == 13)
          {
             text[i] = '\0';
             break;
          }
       }
       printf ("%s", text);
       getch ();
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaª~Kêú¿╚☺¿ "
    Press ENTER to continue.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    Pour le printf("tttt") c'est juste un exemple que j'ai pris ainsi que les valeur dur , c'est des trucs qu'on peut change facilement.

    Pour le i<20 ta raison j'avais oublie la dernière case et j'avais oublie le BS (j'avais jamais fait un truc du genre, c'est ma première fois, j'y prêterai attention la prochaine fois).

    Pour le printf("%c") je vois pas ou est l'erreur (on nous a appris a l'école) ainsi que le void main () .

    Pour le clreol c'est pour supprime le tttttt qui est affiche a l'écran (vu que le but de ce code est de supprime un message affiche dans l'écran quand l'utilisateur entre la première lettre de son nouveau message et d'en afficher la suite) .

    Voila pour mon code^^.

    Maintenant j'ai des questions a propos du tien

    j'ai remarque que ta mis cprintf ("\b_\b"); quelle est la différence entre cprintf et printf ? et si j'ai bien compris les \b c'est pour revenir d'une case a l'arrière ?

    enum c'est pour déclarer des constantes je pense mais le dummy c'est
    pourquoi?

    voila je pense que c'est tout.
    Merci encore pour ton aide

  15. #15
    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 : 67
    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 djinpark1 Voir le message
    j'ai remarque que ta mis cprintf ("\b_\b"); quelle est la différence entre cprintf et printf ?
    cprintf() est la version 'conio' de printf(). Le problème de printf() est

    - il ne prend pas les couleurs (du moins dans sa version originale sous DOS)
    - il peut être redirigé vers un flux

    Il est donc inopportun d'utiliser printf() dans une application plein écran (sauf pour faire des traces que l'on redirige alors dans un fichier ou un port série, par exemple, sinon on perturbe l'affichage).

    et si j'ai bien compris les \b c'est pour revenir d'une case a l'arrière ?
    Oui, c'est la version 'C' de BS.
    enum c'est pour déclarer des constantes je pense mais le dummy c'est
    pourquoi?
    Gros truc de fainéant de programmeur : c'est juste un élément final de la liste qui ne sert à rien d'autre que de ne pas être suivit d'une virgule, (requis en C90), ce qui permet une maintenance facile de la liste par copié/collé sans avoir à gérer la ','

  16. #16
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    - il peut être redirigé vers un flux
    Quesque ça veut dire ?

    merci beaucoup pour ton aide.

  17. #17
    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 : 67
    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 djinpark1 Voir le message
    - il peut être redirigé vers un flux
    Quesque ça veut dire ?
    Si tu lances l'application avec ">fichier.txt" sur la ligne de commande, avec la plupart des OS connus, tout ce qui est émis vers stdout (printf() etc.) arrive dans le fichier.

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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