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 :

Probleme Avec Scanf Et Gets !


Sujet :

C

  1. #1
    A_B
    A_B est déconnecté
    Membre du Club Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Points : 55
    Points
    55
    Par défaut Probleme Avec Scanf Et Gets !
    Salut
    j'ai un petit probleme avec les scanf pour les strings, je doit lire des phrases avec des espaces blancs, jai utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf ("%[^\n]",CHAINE);
    celà a marché dans une petite fonction seule, mais a echoue dans mon programme principale comportant des champs chaine dans des structures : le probleme que le programme saute le premier champs NOM meme aves GETS !
    voila mon code :
    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
    107
    108
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    typedef struct perso {
     
    		char nom[21];
    		char prenom [21];
    		char datenaissance [11];
    		char adresse [31];
    		char telephone [11];
     
    				      }bloc ;
     
     
     
     
    int main()
    {
    void remplir(FILE* fichier,bloc nouv);
    void acceuil ();
    void menu();
    void lister (FILE * fichier);
     
    FILE * fichier;
    bloc nouv ,temp;
     
    char nomfich[11];
    int choix;
     
        clrscr();
        MENU :
        clrscr();
        acceuil();
        menu();
        scanf ("%d",&choix);
     
     
        {
          switch (choix)
    		   {
    		    case 1 :
    			    clrscr();
     
    			    remplir(fichier,nouv);
    			    break ;
    		    case 4 :clrscr();
    			    lister(fichier);
    			    break ;
    		    case 5 :
    			    goto EXIT ;
     
    		   }
     
     
         }
     
     goto MENU;
      EXIT :
     fclose(fichier);
     return 0;
    }
     
     
    void acceuil ()
    {
        printf ("\n\n\n\n\n\t---BIENVENUE_AU_PROGRAMME_DE_GESTION_DE_PERSONNEL---\n");
    };
    void menu()
        {
         printf("\n\n\n\n\n\tENTRER UN CHOIX\n\n\n\n\n\n");
         printf("***1->\t\t\t_AJOUT\n***2->\t\t\t_SUPPRESSION\n***3->\t\t\t_CHERCHER\n***4->\t\t\t_LIRE\n***5->\t\t\t_EXIT\n");
        };
     
    void lister (FILE * fichier)
    		       {
    			  bloc temp ;
    			  fichier = fopen ("repp","r");
    			  printf ("\n LISTE_DES_TRAVAILLEURS\n");
    			  while (fread(&temp,sizeof(bloc),1,fichier),!feof(fichier))
    			  {
    			  printf("\n\nNom : %s \nPrenom  : %s\ndate_naissance  : %s\nAdresse : %s\nTel : %s",temp.nom,temp.prenom,temp.datenaissance,temp.adresse,temp.telephone);
    			  getch();
    			  }
    			  fclose(fichier);
     
    			};
    void remplir (FILE *fichier,bloc nouv)
    {                   fichier=fopen("repp","a");
    		    puts("VEULLEIZ SAISISSEZ\n");
    		    puts("**NOM ?**\n");
    		    gets (nouv.nom);
    		    puts("**PRENOM ?**\n");
    		    gets (nouv.prenom);
    		    puts("**DATE_DE_NAISSANCE ?**\n");
    		    gets (nouv.datenaissance);
    		    puts("**ADRESSE ?**\n");
    		    gets (nouv.adresse);
    		    puts("**TEL ?**\n");
    		    gets (nouv.telephone);
     
    		    fwrite(&nouv,sizeof(struct perso),1,fichier);
    		    fclose(fichier);
     
     
    };

  2. #2
    A_B
    A_B est déconnecté
    Membre du Club Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Points : 55
    Points
    55
    Par défaut
    meme en remplaçant ces instruction avec gets avec ça donne la meme chose meme pire ça saute tout les champs !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Utilise fgets au lieu de gets (cf FAQ)

    Sinon, pour ton code :
    - supprime les gotos. Utilise une boucle while, tu n'auras plus besoin de goto.
    - declare tes fonctions en dehors du main
    - dans remplir(), tu passes nouv en parametre. Si tu veux passer une structure, passe plutot un pointeur sur la structure. Si tu passes le parametre par valeur, il va etre copié (i.e. tous ses champs vont être copiés). Mise a part que ca n'est sans doute pas souhaitable de faire ce genre de copie, le paramètre ne peut être du coup qu'un paramètre d'entrée.

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Il y a pas mal de choses qui ne vont pas dans ton code, en particulier l'utilisation de l'instruction goto et de la fonction gets(). En effet, l'usage de goto est fortement déconseillé, car, sauf dans certains cas particulier où son usage est défendable (encore que...), cette instruction nuit à la lisibilité du code en rompant l'harmonie de la programmation structurée et conduit souvent à du code spaghetti. Quant à gets(), cette fonction est dangereuse est doit systématiquement être substituée par fgets() dans le cadre de nouveaux développements. fgets() peut également être utilisée en lieu et place de scanf().

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    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 A_B
    Salut
    j'ai un petit probleme avec les scanf pour les strings, je doit lire des phrases avec des espaces blancs,
    http://emmanuel-delahaye.developpez.com/inputs.htm
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Sauvegarder une structure dans un fichier binaire comme tu le fais dans la fonction remplir() n'est pas une pratique recommandable et peut réserver des surprises si tu es ammené à changer de machine. Pour en savoir plus à ce sujet: http://emmanuel-delahaye.developpez....m#enreg_struct

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par A_B
    Salut
    j'ai un petit probleme avec les scanf pour les strings, je doit lire des phrases avec des espaces blancs
    Ce poste te donnera quelques pistes: http://www.developpez.net/forums/sho...d.php?t=290633

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    A_B
    A_B est déconnecté
    Membre du Club Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Points : 55
    Points
    55
    Par défaut
    Je sait ya beaucoup de choses a optimiser, j'ai pas fait le menage encore ..
    Mais le probleme qui se pose c'est : pourquoi le programme n'attend pas la saisie avec ces deux fonctions, par contre lorsque je les ai introduites dans un petit programme il ont fonctionné normalemnt !
    est ce qu'il ya autres choses a ajouter a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%[^\n]",chaine);
    pourqu'elle lit les espaces..
    MERCI

  9. #9
    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 A_B
    est ce qu'il ya autres choses a ajouter a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%[^\n]",chaine);
    pourqu'elle lit les espaces..
    Tu tiens vraiment à utiliser scanf() ?

    http://emmanuel-delahaye.developpez.com/inputs.htm
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par A_B
    Je sait ya beaucoup de choses a optimiser, j'ai pas fait le menage encore ..
    Mais le probleme qui se pose c'est : pourquoi le programme n'attend pas la saisie avec ces deux fonctions, par contre lorsque je les ai introduites dans un petit programme il ont fonctionné normalemnt !
    est ce qu'il ya autres choses a ajouter a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%[^\n]",chaine);
    pourqu'elle lit les espaces..
    MERCI
    Déjà, pour une saisie de chaîne de caractères sécurisée (sans débordement de tampon) avec scanf(), tu dois avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char s_buffer[51] = {0};
    /*...*/
    scanf("%50[^\n]");
    A ce stade, au minimum, il reste le caractère de fin de ligne '\n' dans le tampon du flux d'entrée standard stdin. Ainsi, si vous appelez une nouvelle fois scanf() ou fgets sur stdin, le programme n'attendra pas la saisie de l'utilisateur. Il est nécessaire de vider le tampon après un tel appel à scanf(). Il est de bon ton de vérifier également que la saisie n'a pas tronqué les données introduites par l'utilisateur. Bref, les entrées/sorties utilisateur, c'est tout un art, et les liens que t'a passé Emmanuel sont excellents. Pour ce qui est de la vidange du tampon de stdin, voici deux méthodes:
    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
    void flush_stdin(void)
    {
        int c;
     
        while ((c = fgetc(stdin)) != '\n' && c != EOF)
        {
            /* On ignore les caractères saisis */
            continue;
        }
    }
     
     
    /* ou */
     
    /* Voir: http://xrenault.developpez.com/tutoriels/c/scanf/ */
    void flush_stdin(void)
    {
        scanf("%*[^\n]");
        getchar();
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    A_B
    A_B est déconnecté
    Membre du Club Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Points : 55
    Points
    55
    Par défaut
    Il ya deux choses que je voit et je ne comprend pas :
    1-fflush : ça veut dire quoi et ça fait quoi .
    2-Dans la declaration de certaine fonction il y a parfois : STATIC qque chose , ca veut dire quoi "static" dans cet emplacement ?
    MERCI

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. probleme avec les fonction get et set
    Par Invité dans le forum Flex
    Réponses: 0
    Dernier message: 23/01/2008, 14h44
  2. problem avec scanf
    Par yous18 dans le forum Débuter
    Réponses: 5
    Dernier message: 14/09/2007, 03h24
  3. Probleme avec scanf
    Par LinuxUser dans le forum C
    Réponses: 3
    Dernier message: 17/05/2007, 14h18
  4. Probleme avec la fonction gets
    Par figo7 dans le forum C
    Réponses: 21
    Dernier message: 23/03/2007, 15h54
  5. Perl probleme avec socket et Get
    Par killuaster dans le forum Programmation et administration système
    Réponses: 9
    Dernier message: 11/10/2006, 21h27

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