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 de scanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Par défaut problème de scanf
    bonsoir , mon but de ce code est de faire une liste chainée , chaque liste chainée se constitue d'une structure contenant les information des étudiants (numero,nom,prenom,moyenne) et j'ai fait une boucle while qui sera désactivée lorsque je saisis un nombre différent de 1 et ainsi afficher toute la liste chainée des étudiants .
    saif que le programme se plante dans l'exécution ,et parfois il saute des scanfs .
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
     
     
     
    int main(int argc , char *agrv[])
    {
        int classement=1;
    int nb=1;
       typedef struct info{
       char  numero[10] ;
       char nom [20];
       char prenom [20];
       char niveau [20];
       float moyenne ;
       struct info *next;
    }etudiant;
    etudiant *tete,*p;
      tete=NULL;
      while(nb==1)
    {
     
      etudiant *eleve;
    eleve=(etudiant*)malloc(sizeof(etudiant));
    printf("entrer le numero del'etudiant %d: \n",classement);
     scanf("%s",eleve->numero)  ;
    printf("entrer le nom del'etudiant  \n");
     scanf("%2f",eleve->nom)  ;
      printf("entrer le prenom del'etudiant  %d\n",classement);
      scanf("%2f",eleve->prenom)  ;
     printf("entrer le niveau del'etudiant  %d\n",classement);
      scanf("%2f",eleve->niveau)  ;
    printf("entrer la moyenne del'etudiant %d\n",classement);
     scanf("%2f",eleve->moyenne)  ;
    eleve->next=tete ;
    tete=eleve ;
    printf("\n\n\nsi vous voulez entrer les information d'un nouvel eleve ,taper 1\n") ;
    scanf("%d",&nb)  ;
    classement++;
    }
    p=tete; classement=1;
    while(p!=NULL)
    {
    printf("____________________________________________");
     printf("\nles information de l'eleve numero %d\n",classement );
     printf("%s \n",p->numero) ;
      printf("%s \n",p->nom) ;
     printf("%s \n",p->prenom) ;
     printf("%s \n",p->niveau) ;
     printf("%d \n",p->moyenne) ; 
    classement++;
    p=p->next;
    }
      return 0;
    }

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par débutant_01 Voir le message
    et parfois il saute des scanfs .
    Bonjour

    C'est un problème connu. Quand tu veux saisir un nombre et que tu écris scanf("%d", &nb) puis que tu tapes ton nombre (exemple "10"), alors tu tapes "1", "0" suivi de <return>. Or ce <return> n'étant pas numérique, il reste dans stdin. ensuite, au scanf() suivant, le <return> toujours présent est alors lu (surtout si le scanf() suivant attend une chaine).

    scanf() n'est pas fait pour les saisies humaines. C'est bien au début pour avoir un truc de TP mais ensuite faut changer.

    Si tu veux faire une saisie efficace, il faut passer par fgets()
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char tampon[100];
    int nb;
    while (1)
    {
        printf("Entrez votre age\n");
        fgets(tampon, 100, stdin);
        if (sscanf(tampon, "%d", &age) == 1) break;
        printf("Saisie incorrecte, recommencez !!!\n");
    }

    La différence c'est que fgets() récupère tout le contenu de stdin jusqu'au <return> inclus. Donc stdin reste toujours clean.

    Concernant ta liste chainée elle semble correcte mais écrite à la "va comme je te pousse" (c'est indenté comme un gros sale et en plus tout dans le main). Va voir ici t'as un exemple de liste chainée écrit un peu plus proprement...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gard (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Par défaut merci
    d'accord merci , je vais essayer d'appliquer tes recommandation merci encore une fois

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ce n'est pas la cause du problème.

    Le problème évoqué par Sve@r se produit lorsqu'on mélange des scanf() où les caractères <blancs> (donc en particulier le return) sont des délimiteurs et sont ignorés lorsqu'ils précèdent le champ à lire (par exemple %s, %f, %d,...) avec des scanf() où les caractères <blancs> sont traités comme n'importe quel autre caractère (par exemple %c). Or ici, on n'a que des scanf() du premier type.

    Par contre, il y a deux erreurs dont la première justifie un comportement erratique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%2f",eleve->moyenne)  ;
    Dans un scanf() on doit préciser l'adresse de destination donc ici l'adresse de eleve->moyenne. Le & d'adressage n'a pas à figurer dans les autres scanf(), car, pour eux, l'argument est un tableau dont l'identificateur représente (dans ce contexte) l'adresse du premier élément.

    Deuxième erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d \n",p->moyenne) ;
    p->moyenne est un float, pas un entier.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Par défaut
    Bonjour,

    J'aimerais connaitre la logique de lecture:
    numero,nom,prenom et niveau sont des chaines de caractères mais le niveau est lu avec %s par contre les autres auront droit à un %2f.

    L'utilisation de la fonction scanf() pour des chaines de caractères est déconseillée!

    Enfin un dernier point ,tu aura une incohérence d'affichage car tu commencera par afficher le dernier élément de la chaîne mais dans l'affichage avec la variable classement réinitialisée à 1 tu prétendras que c'est le premier élément. Ça aura une répercussion sur l'utilisateur qui à la saisie voit des numéros mais à l'affichage en verra d'autres car le premier élément saisi sera affiché en dernier!

    Bon courage

Discussions similaires

  1. Problème avec scanf("%s",str)
    Par mathieumadrid dans le forum C
    Réponses: 4
    Dernier message: 18/12/2006, 16h47
  2. problème avec scanf
    Par mimina dans le forum C
    Réponses: 27
    Dernier message: 13/11/2006, 19h30
  3. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  4. problème avec scanf
    Par thierry_b dans le forum C
    Réponses: 10
    Dernier message: 21/12/2005, 20h10
  5. problème avec scanf
    Par troumad dans le forum C
    Réponses: 30
    Dernier message: 20/11/2005, 15h21

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