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 :

fonction gets() : chaine de caractères


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut fonction gets() : chaine de caractères
    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>
     
    int main()
    {
        int i,j,n,somme=0,min,x;
        float tab[100],moy;
        char ch[100][40];
        char tampon[40];
     
        printf(" \n ");
        printf(" donner le nombre des etudiants : \n ");
        scanf("%d",&n);
        printf(" \n ");
     
        for(i=1;i<n+1;i++)
        {
         do
         {
         printf(" donner le nom de l'etudiant %d \n ",i);
         //scanf("%s",ch[i]);
         gets(ch[i]);
         printf(" donner la moyenne de l'etudiant %d \n ",i);
         scanf("%f",&tab[i]);
         }
         while (tab[i]<0 || tab[i]>20);
        }
    bonjour cher modero ! j'ai un problème au niveau de la fonction gets() : l'exercice est de saisir le nom de l'étudiant & sa moyenne puis faire d'autres manipulations, mais le problème est que lors de l'exécution la saisie du nom avec gets ne s'effectue pas il m'affiche directement le deuxième printf pour saisir la moyenne tant dis que avec scanf marche nickel !!!!!!

  2. #2
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    Bonjour,

    La fonction gets est un fgets sur stdin avec la différence que le line feed n'est pas mis dans chaîne. Malheureusement, l'interface de gets est une catastrophe : il n'a pas le paramètre taille qui donne la taille du tableau pointé par chaîne. Ceci interdit donc à gets toute vérification pour ne pas déborder du tableau.
    Pour cette raison l'usage de gets est très fortement déconseillé
    --> http://c.developpez.com/cours/bernar...00000000000000

    essaye de passer par un fgets() directement;

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Il ne faut pas utiliser gets mais fgets. Pour ta question, la réponse se trouve ici (Lire de manière sûre des données sur l'entrée standard).

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par Melem Voir le message
    Il ne faut pas utiliser gets mais fgets. Pour ta question, la réponse se trouve ici (Lire de manière sûre des données sur l'entrée standard).

    oui admin ! je l'ai utilisé mais même resultat !!

    voici l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fgets(ch[i],sizeof(ch[i]),stdin);
    [IMG]file:///C:/Users/3omda/Desktop/code.jpg[/IMG]

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par hannibal007 Voir le message
    oui admin ! je l'ai utilisé mais même resultat !!

    voici l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fgets(ch[i],sizeof(ch[i]),stdin);

  6. #6
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    es tu sûr du
    ?

    j'aurais plutôt mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fgets(ch[i],sizeof(ch),stdin);
    Ce dont je suis certain c'est que le scanf laisse un '\n' dans le stdin du coup le fgets lit une chaîne vide et ton programme continue son exécution.
    Ce qui fait que ton programme affiche "donner le nom de l'étudiant 1", et tout de suite après le "donner la moyenne de l'étudiant 2"

    Donc pour y remédier, tu peux appeler fgetc(stdin) avant le fgets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgetc(stdin);
    fgets(ch[i],sizeof(ch),stdin);
    et normalement ça devrait être bon.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    ouiiiiii !!

    genial !

    ça marcherais nickel ! merci bien pour votre réponse !

    superbe fgetc(stdin) !

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par hannibal007
    oui admin ! je l'ai utilisé mais même resultat !!
    L'utilisation de fgets n'était pas censée résoudre ton problème, mais remplacer l'utilisation de gets. Quand vas-tu commencer à prendre les bonnes habitudes de programmation si ce n'est pas maintenant ? Je t'invite vivement à apprendre à utiliser fgets et à t'en servir dorénavant.

    Citation Envoyé par hannibal007
    ouiiiiii !!

    genial !

    ça marcherais nickel ! merci bien pour votre réponse !

    superbe fgetc(stdin) !
    Non, ça ne marche pas nickel. Malheureusement. Tape 12.5, espace puis ENTREE par exemple au moment où le programme demande la moyenne de l'étudiant pour voir. Pour une vraie solution à ce genre de problème, suis le lien que je t'avais donné.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/01/2011, 19h02
  2. MDX fonction sur chaine de caractères (concat(),Substring())
    Par YagamiRaito dans le forum Mondrian
    Réponses: 2
    Dernier message: 16/08/2007, 17h16
  3. Fonction sur chaine de caractère (ASCII)
    Par Medmidou dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/05/2007, 01h40
  4. [C#] Fonction de Chaine de caractères
    Par slyv dans le forum Windows Forms
    Réponses: 8
    Dernier message: 13/12/2004, 18h41
  5. Réponses: 10
    Dernier message: 17/12/2003, 13h51

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