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 :

kbhit/conio.h


Sujet :

C

  1. #21
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    Après discution, mes collègues commencent aussi à trouver scanf assez merdique

    Je proserais bien de faire une fonction du genre avec la même syntaxe que scanf :


    lectureclavier("Chaine avec formateur",adresses des variables)
    {
    char CHN[100];

    fgets(CHN,100);
    return sscanf(CHN,"Chaine avec formateur",adresses des variables);
    }

    Mais j'ai oublié comment on gère et on déclare les fonctions avec un nombre quelconque de variables.
    Comment gérer une entrée suppérieure à 100 caractères ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #22
    Expert éminent
    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
    Par défaut
    Citation Envoyé par troumad
    Après discution, mes collègues commencent aussi à trouver scanf assez merdique

    Je proserais bien de faire une fonction du genre avec la même syntaxe que scanf :


    lectureclavier("Chaine avec formateur",adresses des variables)
    {
    char chn[100];

    fgets(chn,sizeof chn, stdin);
    return sscanf(chn,"Chaine avec formateur",adresses des variables);
    }

    Mais j'ai oublié comment on gère et on déclare les fonctions avec un nombre quelconque de variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     lectureclavier(char const *fmt, ...)
    Il faut utiliser vsscanf()...

    Comment gérer une entrée suppérieure à 100 caractères ?
    Ca dépend de ce que tu appelles gérer... Si c'est ignorer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     fgets(chn,sizeof chn, stdin);
    clean (chn,stdin);
    avec
    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
     
    void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n');
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
          while ((c = fgetc(fp)) != '\n' && c != EOF)
          {
          }
       }
    }
    Mais si tu veux une entrée de taille non limitée, il faut utiliser des techniques de realloc()... ou ma fonction get_line()

    http://emmanuel-delahaye.developpez.com/clib.htm
    Modules IO et FSTR

  3. #23
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    Maintenant, j'ai compris ton clean. Si je rentre une chaîne de 106 caractères, il faut bien comprendre qu'avec un fgets(CHN,100,stdin); le 100ème caractère sera 0=> pas le '\n' avant le zéro, mais uniquement que 99 caractères récupérés. Il restera 7 caractères, comme si on avait fait juste une entrée de 7 caractères.

    Je vais essayer de me faire à la main (sans regarder tes sources pour le moment) un realloc.

    nb : en ce moment, je suis débordé car je fais poser des panneaux solaires sur ma maison !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #24
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    Ceci pour récupérer la chaîne complète :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define L 10
     
    int main()
    {
     char * CHN;
     short l=L;
     
     CHN=(char *)realloc(CHN,l);
     fgets(CHN,L,stdin);
     
     while (strchr (CHN, '\n')==NULL)
     // tant qu'on n'a pas saisie la fin de chaîne, on le cherche
     {
      l+=L;
      CHN=(char *)realloc(CHN,l);
      fgets(CHN+l-L-1,L+1,stdin);
      // astuce : il faut penser qu'à la fin du précédent fgets
      // on a mis un 0, il faut partir de là, ceci implique de
      // récupérer un caractère de plus
     };
     
     printf("\nLe résultat final : %s\n",CHN);
     
    }
    Maintenant, comment récupérer les variables avec une définition de la forme : lectureclavier(char const *fmt, ...) ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  5. #25
    Expert éminent
    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
    Par défaut
    Citation Envoyé par troumad
    Ceci pour récupérer la chaîne complète :
    • Le bon type pour les tailles est size_t et non short...
    • Eviter les variables nommées 'l'. Trop de confusions possibles... 'len' ou plutôt ici, 'size' est OK.
    • On l'a déjà dit plusieurs fois, mais il n'y a pas besoin des casts en C.
    • Le premier realloc() pourrait être un malloc() , ou alors un realloc() avec NULL...
    • CHN n'est pas une constante, elle ne devrait pas être en majuscule
    Maintenant, comment récupérer les variables avec une définition de la forme : lectureclavier(char const *fmt, ...) ?
    va_list
    va_start()
    va_end()...

    tout est expliqué dans ton livre de C...

    http://publications.gbdirect.co.uk/c...r9/stdarg.html

    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
     
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdarg.h>
     
    static void purge(FILE *fp)
    {
       int c;
       while ((c = fgetc(fp)) != '\n' && c != EOF)
       {
       }
    }
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n'); /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          purge (fp);
       }
    }
     
    static int getf(char const *fmt, ...)
    {
       int n;
       va_list va;
       va_start (va, fmt);
       char s[128];
       fgets(s, sizeof s, stdin);
       clean(s, stdin);
     
       n = vsscanf (s, fmt, va);
       va_end(va);
       return n;
    }
     
    int main (void)
    {
       char s[11];
       int d;
     
       printf ("Nom age : ");
       fflush (stdout);
       {
          int n = getf ("%10s %d", s , &d);
     
          if (n == 2)
          {
             printf ("Nom = '%s' age = %d\n", s, d);
          }
       }
       return 0;
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Nom age : Emmanuel 49
    Nom = 'Emmanuel' age = 49
     
    Press ENTER to continue.

  6. #26
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    OK !

    Il reste encore de question : le type size_t, il correspond à quoi ?

    Quant à va_start et va_end, man va_start m'a été utile . Mais j'ai vu une erreur :
    Citation Envoyé par man va_start
    va_end
    Ã chaque invocation de va_start() doit correspondre une invocation de
    va_end() dans la même fonction. AprÚs l'appel va_end(ap) la variable
    ap est indéfinie. Plusieurs traversées de la liste sont possible, Ã
    condition que chacune soit encadrée par va_start() et va_end().
    va_end() peut être une macro ou ue fonction.
    En dehors des problèmes de codage(peut-être du à mandriva cooker et une config passée par debian sid), à la dernière ligne, il y a "ue" à la place de "une"


    Qui prévenir et comment ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  7. #27
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par troumad
    OK !

    Il reste encore de question : le type size_t, il correspond à quoi ?
    size_t est le type le plus grand sur une architecture.

  8. #28
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    Voici ce que j'ai fait. Ça passe le petit test que je viens de faire :
    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
    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
     
    #define LONG 10
     
    int lectureclavierf(char const *format, ...);
    // comme un scanf mais sécurisé : vide le buffer complétement puis analyse les données
    char * lectureclavier();
    // renvoie tout ce qui est dans le buffer après l'appui de la touche entrée
     
    #define N 26
    [...]
     
    lectureclavierf(char const *format, ...)
    {
     int n;
     char * chn;
     va_list va;
     va_start (va, format);
     
     chn=lectureclavier();
     n = vsscanf(chn, format, va);
     va_end(va);
     free(chn);
     return n;
    }
     
     
    char * lectureclavier()
    {
     char * chn ;
     size_t l=LONG;
     
     chn=(char *)malloc(l);
     fgets(chn,LONG,stdin);
     
     while (strchr (chn, '\n')==NULL)
     // tant qu'on n'a pas saisie la fin de chaîne, on le cherche
     {
      l+=LONG;
      chn=(char *)realloc(chn,l);
      fgets(chn+l-LONG-1,LONG+1,stdin);
      // astuce : il faut penser qu'à la fin du précédent fgets
      // on a mis un 0, il faut partir de là, ceci implique de
      // récupérer un caractère de plus
     };
     return chn;
    }
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  9. #29
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Skyrunner
    size_t est le type le plus grand sur une architecture.
    Je ne suis pas sûr de comprendre...

    size_t est le type retourné par l'opérateur sizeof. C'est un entier non signé. Il est suffisament grand pour contenir la valeur représentant, en nombre de bytes, la taille du plus grand objet possible d'une implémentation donnée.

    Il convient pour les tailles, les dimensions de tableau, les index (non négatifs)...

    Cette question étant récurrente, j'ajoute une entrée dans mes 'notes'...

  10. #30
    Expert éminent
    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
    Par défaut
    Citation Envoyé par troumad
    Il reste encore de question : le type size_t, il correspond à quoi ?
    http://emmanuel-delahaye.developpez....tes.htm#size_t

  11. #31
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je ne suis pas sûr de comprendre...
    C'est vrai que c'est très mal dit mais c'est censé vouloir dire ce que tu as dit.

Discussions similaires

  1. getch() et <conio>
    Par zulul dans le forum C
    Réponses: 17
    Dernier message: 25/05/2010, 12h08
  2. conio.h: No such file or directory
    Par débutant_en_C dans le forum C
    Réponses: 3
    Dernier message: 10/08/2006, 18h55
  3. menu déroulant avec conio
    Par lastrecrue dans le forum C
    Réponses: 9
    Dernier message: 01/07/2006, 14h14
  4. Mettre de la couleur avec conio
    Par pi-2r dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 28/06/2006, 17h13
  5. conio.c
    Par teto dans le forum C
    Réponses: 4
    Dernier message: 31/01/2004, 17h40

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