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 fgets : Problème de saisie.


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Agent d'accueil
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agent d'accueil

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Points : 15
    Points
    15
    Par défaut Fonction fgets : Problème de saisie.
    Bonjour à tous et à toutes !

    Je m'adresse à vous car j'ai un petit problème de saisie lors de l'utilisation de la fonction fgetsJ'ai donc besoin que l'utilisateur entre une suite de caractères pour que celle-ci soit stockée dans un tableau de type char.
    J'aimerais par la suite retranscrire cette suite.

    Je ne m'occupe pas de vider le buffer pour le moment car j'aimerais que ma fonction fgets fonctionne d'abord.

    Voici le code de ma fonction :

    Code c : 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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    #include <string.h>
    #include "fonction.h"
     
    void modifNom (char hero[100],int taille) // Fonction qui permet de changer le nom d'un hero.
    {
        printf("==============-------- Choix du nom de %s --------==============\n", hero);
     
        printf("\nVeuillez entrer le nouveau nom de %s ne depassant pas %d caracteres\net sans espaces\n", hero, taille); // Affiche le nom actuel du hero
        fgets(hero, sizeof hero, stdin);// lit le nouveau nom et l'enregistre
        printf("Le nouveau nom est : ");
        printf("%s \n", hero); // affiche le nouveau nom du héro
        system("PAUSE");
    }

    Mon problème est que quand la fonction se lance dans mon programme, elle affiche tout en bloc et s'arrête à l'instruction system("PAUSE").

    Et, du coup, elle ne renvoie rien dans la variable hero et le nom de mon héros est remplacé par du vide.

    Si quelqu'un remarque une erreur dans mon code ou si quelqu'un a une astuce à me donner,

    Je suis toute ouïe !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par kraoui Voir le message
    Si quelqu'un remarque une erreur dans mon code ou si quelqu'un a une astuce à me donner,
    Je suis toute ouïe !
    Bonjour, c'est subtil mais l'erreur est dans le prototype de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void modifNom (char hero[100],int taille)
    Les tableaux sont passés par pointeur lorsqu'ils sont transmis en paramètre, si bien qu'un sizeof tab, pourtant tout-à-fait dans les règles par ailleurs, renverra 4 ou 8 sur un PC 32 bits ou 64 bits, au lieu des 100 attendus.

    Ensuite, si « tout s'affiche en bloc » jusqu'à ton system(), c'est probablement que le buffer clavier n'était pas vide lorsque tu as appelé ta fonction. Il faut donc le nettoyer d'abord mais, de grâce, surtout pas avec fflush(stdin).

  3. #3
    Membre habitué Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par kraoui Voir le message
    Bonjour à tous et à toutes !

    Je m'adresse à vous car j'ai un petit problème de saisie lors de l'utilisation de la fonction fgetsJ'ai donc besoin que l'utilisateur entre une suite de caractères pour que celle-ci soit stockée dans un tableau de type char.
    J'aimerais par la suite retranscrire cette suite.
    est il obliger de use fgets si non tu peut de contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("\nVeuillez entrer le nouveau nom de %s ne depassant pas %d caracteres\net sans espaces\n", hero, taille); // Affiche le nom actuel du hero
        scanf("%s",&hero);  // lit le nouveau nom et l'enregistre

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    L'utilisation de scanf est déconseillé pour lire des entrées non formatées, notamment pour des problèmes de taille de chaîne saisie. fgets est la bonne solution.

    Je ne peux que conseiller la lecture de la page sur les entrées/sorties https://emmanuel-delahaye.developpez...ees-solides-c/
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre à l'essai
    Homme Profil pro
    Agent d'accueil
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agent d'accueil

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour, c'est subtil mais l'erreur est dans le prototype de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void modifNom (char hero[100],int taille)
    Les tableaux sont passés par pointeur lorsqu'ils sont transmis en paramètre, si bien qu'un sizeof tab, pourtant tout-à-fait dans les règles par ailleurs, renverra 4 ou 8 sur un PC 32 bits ou 64 bits, au lieu des 100 attendus.

    Ensuite, si « tout s'affiche en bloc » jusqu'à ton system(), c'est probablement que le buffer clavier n'était pas vide lorsque tu as appelé ta fonction. Il faut donc le nettoyer d'abord mais, de grâce, surtout pas avec fflush(stdin).
    Merci Beaucoup pour ta réponse !
    J'ai changer dans ma fgets le sizeof hero en une constante : 100.

    J'ai aussi vider le buffer avant et après le fgets
    Mon code ressemble donc à ceci et ça fonctionne parfaitement

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void modifNom (char hero[100],int taille) // Fonction qui permet de changer le nom d'un hero.
    {
        clean(hero);
        printf("==============-------- Choix du nom de %s --------==============\n\n", hero);
        printf("\nVeuillez entrer le nouveau nom de %s ne depassant pas %d caracteres\net sans espaces\n", hero, taille); // Affiche le nom actuel du hero
        fgets(hero, 100, stdin);// lit le nouveau nom et l'enregistre
        clean(hero);
        printf("Le nouveau nom est : ");
        printf("%s \n", hero); // affiche le nouveau nom du héro
        system("PAUSE");

    Et le code de ma fonction purger contenu dans ma fonction clean :

    Code c : 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
     
    static void purger()
    {
        int c = 0;
        while (c != '\n' && c != EOF)
        {
            c = getchar();
        }
    }
    void clean(char *chaine)
    {
        char *p = strchr(chaine, '\n');
        if (p)
        {
            *p = 0;
        }
        else
        {
            purger();
        }
    }

  6. #6
    Membre à l'essai
    Homme Profil pro
    Agent d'accueil
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agent d'accueil

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Abacar94 Voir le message
    est il obliger de use fgets si non tu peut de contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("\nVeuillez entrer le nouveau nom de %s ne depassant pas %d caracteres\net sans espaces\n", hero, taille); // Affiche le nom actuel du hero
        scanf("%s",&hero);  // lit le nouveau nom et l'enregistre

    En faite j'aurai du changé mon code avant de poster mais je voulais qu'on puisse entrer un nom avec espace .
    Sinon en effet, c'est le premier code que j'avais

  7. #7
    Membre à l'essai
    Homme Profil pro
    Agent d'accueil
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agent d'accueil

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Bonjour,

    L'utilisation de scanf est déconseillé pour lire des entrées non formatées, notamment pour des problèmes de taille de chaîne saisie. fgets est la bonne solution.

    Je ne peux que conseiller la lecture de la page sur les entrées/sorties https://emmanuel-delahaye.developpez...ees-solides-c/
    J'y jette un oeil maintenant

  8. #8
    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
    Par défaut
    Citation Envoyé par kraoui Voir le message
    Merci Beaucoup pour ta réponse !
    J'ai changer dans ma fgets le sizeof hero en une constante : 100.
    Pourquoi ne pas passer taille?
    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.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Agent d'accueil
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agent d'accueil

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pourquoi ne pas passer taille?
    J'aurai pu en effet :p. Je t'avoue que j'ai changé ça vite fait au boulot :p

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

Discussions similaires

  1. [MySQL] Problème avec la fonction fgets et les retours chariot
    Par didoulive dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/02/2008, 19h08
  2. Richeditctrl - problème de saisie clavier
    Par KO-Tek dans le forum MFC
    Réponses: 5
    Dernier message: 20/12/2005, 11h15
  3. Problème de saisie de caractères
    Par XantaX dans le forum Assembleur
    Réponses: 3
    Dernier message: 07/12/2005, 15h37
  4. Réponses: 20
    Dernier message: 25/09/2005, 15h07
  5. Problème de saisie avec le "."
    Par Pouf dans le forum ASP
    Réponses: 10
    Dernier message: 18/03/2005, 15h27

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