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 :

problem avec scanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Par défaut problem avec scanf
    salut tous

    dans mon code j'ai ecri cette ligne
    pour sauter une ligne apres le scanf mais il y avait un deshordre dans le .exe
    alors c'e quoi la raison ?


    aussi pourquoi on doit pas succeder deux scanf ou plus ? et pourqoui cette fonction est utile dans ce cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
        char m = 0;
     
        m = getchar(); 
     
        while (getchar() != '\n') ;
     
        return m; 
    }

  2. #2
    Membre confirmé Avatar de Laughing Man
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    Pour répondre aux deux questions :

    tu verras que scanf est pas une bonne solution (sauf si tu sais l'utiliser à la perfection)



    vas voir dans le forum c ya un topic pas vieux qui traite de sa

  3. #3
    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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    La fonction scanf() est très complexe. Je recommande:


    Cette question est souvent traitée sur ce forum, et en effectuant une recherche avec les mots clés fgets, fclean (ou clean), tu devrais trouver de l'information. Je mets tout de même un exemple pour la saisie d'un entier.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void fclean(char *buffer, FILE *stream);
     
    int main(void)
    {
        int n = 0;
        char buffer[15] = "";
        char *p_end = NULL;
     
        do
        {
            printf("Entrez un entier: ");
            fflush(stdout);
     
            p_end = NULL;
     
            if (fgets(buffer, sizeof buffer, stdin) != NULL)
            {
                fclean(buffer, stdin);
                n = strtol(buffer, &p_end, 0);
            }
        }
        while (p_end == NULL || *p_end != 0);
     
        printf("Vous avez saisi l'entier %d!\n", n);
     
        return EXIT_SUCCESS;
    }
     
    /* Elimine le caractere de fin de ligne terminant la saisie et vide le tampon
       du flux d'entree stream si necessaire */
    static void fclean(char *buffer, FILE *stream)
    {
        char *pc = strchr(buffer, '\n');
     
        if (pc != NULL)
        { /* Le caractere de fin de ligne a ete trouve. La saisie est complete */
     
            *pc = 0;
        }
        else
        { /* La saisie a ete tronquee. On vide le tampon du flux stream */
     
            /* Important: la fonction fgetc(stream) retourne un entier de type int,
               pas de type char. */
            int c;
     
            while ((c = fgetc(stream)) != '\n' && c != EOF)
            {
                /* On ignore les caractere presents dans le tampon */
            }
        }
    }
    Il est également possible d'utiliser la fonction sscanf() à la place de strtol(). Pour plus de confort, la meilleure stratégie à appliquer est de se construire une petite bibliothèques de fonctions E/S et problème est définitivement réglé. Pour plus d'info sur les entrées/sorties sécurisées en C, un "must" à lire absolument est: http://emmanuel-delahaye.developpez.com/inputs.htm

    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++

    +

  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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par yous18 Voir le message
    pour sauter une ligne apres le scanf mais il y avait un deshordre dans le .exe
    alors c'e quoi la raison ?


    aussi pourquoi on doit pas succeder deux scanf ou plus ?
    Par contre là, je ne comprends ce que tu veux dire...

    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par yous18 Voir le message
    dans mon code j'ai ecri cette ligne
    pour sauter une ligne apres le scanf
    What ? tu confonds scanf() et printf() ? résultat : un comportement indéfini. Il se passe n'importe quoi.

    Comme déjà conseillé, n'utilise pas scanf() si tu n'es pas un expert confirmé initié par gourou de niveau 9. Il y a des alternatives beaucoup plus simples à mettre en oeuvre.
    mais il y avait un deshordre dans le .exe
    C'est aussi le désordre dans tes doigts on dirait... rebranche les dans le bon ordre...
    aussi pourquoi on doit pas succeder deux scanf ou plus ? et pourqoui cette fonction est utile dans ce cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
        char m = 0;
     
        m = getchar(); 
     
        while (getchar() != '\n') ;
     
        return m; 
    }
    Pour de nombreuses raisons techniques assez complexes expliquées ici :

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc

    (sachant que scanf() est construit sur fgetc(), comme toutes les fonctions d'entrées).

  6. #6
    Membre très actif
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Par défaut
    merci les amis pour les explication

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

Discussions similaires

  1. Probleme avec scanf et printf imbriqués
    Par nozgarde dans le forum C
    Réponses: 8
    Dernier message: 11/04/2008, 11h24
  2. Probleme avec scanf
    Par LinuxUser dans le forum C
    Réponses: 3
    Dernier message: 17/05/2007, 14h18
  3. Probleme avec un scanf
    Par johnson95 dans le forum C
    Réponses: 5
    Dernier message: 29/03/2007, 23h09
  4. Probleme Avec Scanf Et Gets !
    Par A_B dans le forum C
    Réponses: 11
    Dernier message: 09/03/2007, 21h20
  5. [debutant] Probleme avec le scanf()
    Par mc_fly dans le forum C
    Réponses: 21
    Dernier message: 07/09/2006, 12h22

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