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 :

Implémenter la fonction Scanf


Sujet :

C

  1. #1
    Membre habitué
    Avatar de CPI_en_mousse
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 332
    Points : 168
    Points
    168
    Par défaut Implémenter la fonction Scanf
    Bonjour à tous.

    je dois implementer ma propre fonction scanf en C pour un TP. cette fonction Scanf prend en compte un nombre d'arguments variables. j'ai trouve un debut de reponse avec va_list et les macro va_start, va_arg et va_end de la lib <stdarg.h> mais je n'arrive pas à les implementer correctement, si quelqu'un pourrai m'expliquer comment ca marche.

    voici mon code que j'ai génére pour l'instant:

    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
    void scanf2(char *control, ...)
    {
    va_list ap;
    int d;
    char c, *p, *s;
    char *g;
     
    gets2(&g);               //recupere une chaine de caractere de l'user
     
    va_start (ap, control);
    while (*control)
    	{
    	if (control=='%')
    		{
    		*control ++;
    		switch  (*control ++)
    			{
    			case 's': /* cadena */
                                    // renvoi la chaine user dans l'arg ...?
    				s = va_arg (ap, char *);
    				printf ("chaine %s\n", s);
    				break;
    			case 'd':  /* entier */
                                  // renvoi la chaine user  convertie en int dans l'arg ...?
    				d = va_arg (ap, int);
    				//d=atoi(&g);
    				printf ("int %d\n", d);
    				break;
    			case 'c': /* caractère */
                             // renvoi la caractere user dans l'arg ...?
    				c = va_arg (ap, char);
    				printf ("char %c\n", c);
    			break;
    			}
    		}
    	}
    //va_arg
    	/*
    	if (strcmp(s,"%i")==0)
    		v=atoi(&c);
    	//printf("%i",atoi(&c));*/
    	va_end(ap);
    }
    la fontion doit recuperer ce que tape l'utilisateur et ly convertir (si bessoin) dans le bon type en fonction du 1er parametre passé (la chaine (%s,%i...)) pour pouvoir placer ce resultat dans le ou les parametres qui suivent.

    merci pour votre aide.

  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 Re: Implémenter la fonction Scanf
    Citation Envoyé par CPI_en_mousse
    je dois implementer ma propre fonction scanf en C pour un TP. cette fonction Scanf prend en compte un nombre d'arguments variables. j'ai trouve un debut de reponse avec va_list et les macro va_start, va_arg et va_end de la lib <stdarg.h> mais je n'arrive pas à les implementer correctement, si quelqu'un pourrai m'expliquer comment ca marche.
    Y'a de l'idée, mais il faut se souvenir que scanfx() attend des adresses, donc il faut des pointeurs pour récupérer les valeurs des paramètres...

    D'autre part, la réduction de la portée des variables permet de rendre le code plus lisible.
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    #include <stdio.h>
    #include <stdarg.h>
     
    static void clean(char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr(s, '\n');
       if (p != NULL)
       {
          /* ... kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
          while ((c = getchar()) != '\n' && c != EOF )
          {
          }
       }
    }
     
    static void scanf2(char const *const control, ...)
    {
       char line[BUFSIZ];
     
       //recupere une chaine de caractere de l'user
       fgets(line, sizeof line, stdin);
       clean(line, stdin);
     
       /* analyse */
       {
          va_list ap;
          va_start (ap, control);
          char const *p = control;
          while (*p != 0)
          {
             if (*p == '%')
             {
                p++;
                switch (*p)
                {
                case 's':       /* cadena */
                   {
                      char *s = va_arg (ap, char *);
                      if (s != NULL)
                      {
                         /* Danger !
                          * On ne connait pas la taille de la destination.
                          * Debordement possible
                          */
                         strcpy (s, line);
                      }
                   }
                   break;
                case 'd':        /* entier */
                   {
                      int *pd = va_arg (ap, int *);
                      if (pd != NULL)
                      {
                         *pd = (int) strtol(line, NULL, 10);
                      }
                   }
                   break;
                case 'c':       /* caractere */
                   {
                      char *pc = va_arg (ap, char *);
                      if (pc != NULL)
                      {
                         *pc = line[0];
                      }
                   }
                   break;
                }
             }
             p++;
          }
          va_end(ap);
       }
    }
     
    int main(void)
    {
       {
          int i;
          printf ("i = ?\n");
          scanf2("%d", &i);
          printf ("i = %d\n", i);
       }
     
       {
          char c;
          printf ("c = ?\n");
          scanf2("%c", &c);
          printf ("c = '%c'\n", c);
       }
     
       {
          char s[10];
          printf ("s = ? (9 car max)\n");
          scanf2("%s", s);
          printf ("s = '%s'\n", s);
       }
       return 0;
    }
    Pose des questions si tu ne comprends pas.

  3. #3
    Membre habitué
    Avatar de CPI_en_mousse
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 332
    Points : 168
    Points
    168
    Par défaut
    ok merci pour tout

Discussions similaires

  1. Classe Java qui implémente des fonctions oracles
    Par kamacho25 dans le forum Outils
    Réponses: 0
    Dernier message: 28/09/2007, 14h46
  2. Réponses: 7
    Dernier message: 03/03/2007, 19h15
  3. [MySQL] Implémenter une fonction de recherche approximative
    Par Chromatic dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/02/2006, 11h54
  4. [debutant]la fonction scanf
    Par kalaka dans le forum C
    Réponses: 7
    Dernier message: 01/07/2003, 15h15
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

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