Erreur scanf en C
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Erreur scanf en C



  1. #1
    Popadom

    Erreur scanf en C


    ------

    Bonjour,

    Je suivais un tuto pour débuter en C sur Youtube et j'ai le programme suivant:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int age;
        printf("you age: ");
        scanf("%d", &age); 
        printf("you are %d years old\n", age);
        return 0;
    }
    Pas de problème quand je l'exécute, je tape par exemple 100 puis Entrée, la console affiche:
    Code:
    your age: 100
    you are 100 years old
    
    Process return 0 (0x0)
    Pareil avec ce bout de code qui fonctionne sans problème:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char grade;
        printf("your grade: ");
        scanf("%c", &grade);
        printf("your grade is %c\n", grade);
        return 0;
    }
    Console:
    Code:
    your grade: B
    your grade is B
    
    Process return 0 (0x0)
    MAIS: quand je mets les deux bouts de code l'un après l'autre, au moment où je tape Entrée après avoir taper l'âge, le programme se termine sans m'avoir laissé entrer une "grade":
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        int age;
        printf("you age: ");
        scanf("%d", &age); 
        printf("you are %d years old\n", age);
    
        char grade;
        printf("your grade: ");
        scanf("%c", &grade);
        printf("your grade is %c\n", grade);
        return 0;
    }
    Console:
    Code:
    your age: 100
    you are 100 years old
    your grade: your grade is
    
    Process return 0 (0x0)
    ---> ?????
    Une idée d'où vient le problème?
    Merci d'avance!

    -----

  2. #2
    Popadom

    Re : Erreur scanf en C

    Je crois avoir compris d'où vient le problème... En tapant Entrée, scanf sauve ça comme un char nouvelle ligne ("\n") dans ma variable "grade". Si je fais ça:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        int age;
        printf("you age: ");
        scanf("%d", &age); 
        printf("you are %d years old\n", age);
    
        char grade;
        char tmp;
        scanf("%c", &tmp); // récupère le caractère new line
        printf("your grade: ");
        scanf("%c", &grade);
        printf("your grade is %c\n", grade);
        return 0;
    }
    ...ça fonctionne. Console:
    Code:
    your age: 100
    you are 100 years old
    your grade: B
    your grade is B
    
    Process return 0 (0x0)
    Bref. Un peu bizarre quand même Bon, du coup j'aurais pu réfléchir un peu plus avant de poster mon message

  3. #3
    Jack
    Modérateur

    Re : Erreur scanf en C

    Citation Envoyé par Popadom Voir le message
    Un peu bizarre quand même
    Pas vraiment, même si on s'est tout fait prendre au moins une fois: scanf lit dans le flux d'entrée standard "stdin" qui est normalement le buffer mémorisant TOUS les caractères tapés au clavier. Le saut de ligne en étant un il est normal qu'il y soit mémorisé au même titre que la mettre que tu as tapée avant de valider.

  4. #4
    Paraboloide_Hyperbolique

    Re : Erreur scanf en C

    Bonjour,

    C'est un grand classique qui fait partie des subtilités du comportement de scanf et du buffer de "stdin". Je me suis moi-même laissé avoir à l'époque.

  5. A voir en vidéo sur Futura
  6. #5
    CM63

    Re : Erreur scanf en C

    Pas convaincu : Comment se fait-il que ça marchait la première fois, la deuxième routine seule?
    Quoi? Quelque chose que je ne connais pas et qui me fait l'affront d'exister?!

  7. #6
    CM63

    Re : Erreur scanf en C

    Ca veut dire que le deuxième scanf prend le return de fin du premier? Bizarre....
    Quoi? Quelque chose que je ne connais pas et qui me fait l'affront d'exister?!

  8. #7
    CM63

    Re : Erreur scanf en C

    Citation Envoyé par Jack Voir le message
    Le saut de ligne en étant un il est normal qu'il y soit mémorisé au même titre que la mettre que tu as tapée avant de valider.
    ???? et en français? (ne le prend pas mal je raille comme on dit à la SNCF )
    Quoi? Quelque chose que je ne connais pas et qui me fait l'affront d'exister?!

  9. #8
    Paraboloide_Hyperbolique

    Re : Erreur scanf en C

    Quand on tape au clavier une suite de caractère, par exemple "18\n", cela rempli un buffer avec les caractères '1', '8' et '\n' (retour à la ligne).

    L'appel du premier scanf va consommer les caractères '1' et '8'. et s'arrête au premier espace blanc venu, à savoir '\n'. Il restera donc dans le buffer "\n" (le retour à la ligne).

    L'appel du second scanf va consommer les espaces blancs qui sont maintenant en début de buffer, à savoir "\n". Comme il ne s'agit pas d'un nombre, la fonction échoue et retourne immédiatement.


    Voici ce qui est documenté sur cppreference:

    Because most conversion specifiers first consume all consecutive whitespace, code such as

    std::scanf("%d", &a);
    std::scanf("%d", &b);

    will read two integers that are entered on different lines (second %d will consume the newline left over by the first) or on the same line, separated by spaces or tabs (second %d will consume the spaces or tabs).
    The conversion specifiers that do not consume leading whitespace, such as %c, can be made to do so by using a whitespace character in the format string:

    std::scanf("%d", &a);
    std::scanf(" %c", &c); // ignore the endline after %d, then read a char
    https://en.cppreference.com/w/cpp/io/c/fscanf

  10. #9
    Jack
    Modérateur

    Re : Erreur scanf en C

    Citation Envoyé par CM63 Voir le message
    ???? et en français? (ne le prend pas mal je raille comme on dit à la SNCF )
    oups! Il faut remplacer "mettre" par "lettre". J'espère que ça devient plus compréhensible.

  11. #10
    Popadom

    Re : Erreur scanf en C

    Merci pour vos réponses plus détaillées
    A noter pour les autres débutants comme moi que pour contourner le problème, il y a bien plus simple que de créer la variable "tmp" comme dans mon précédent message. En fait il suffit de mettre un espace dans scanf et le problème est résolu.

    Code:
    scanf(" %c", &grade);

  12. #11
    Paraboloide_Hyperbolique

    Re : Erreur scanf en C

    Citation Envoyé par Popadom Voir le message
    En fait il suffit de mettre un espace dans scanf et le problème est résolu.

    Code:
    scanf(" %c", &grade);
    C'est ce qu'indique la dernière ligne de la référence que j'ai citée.

Discussions similaires

  1. Scanf ne repond pas
    Par Claude-23 dans le forum Programmation et langages, Algorithmique
    Réponses: 16
    Dernier message: 28/11/2016, 13h59
  2. question bête sur la scanf en c
    Par caissa dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 02/01/2014, 15h43
  3. Problèmes avec scanf et double
    Par AmigaOS dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 09/01/2011, 16h14
  4. langage C : problème avec variable globale et scanf
    Par invitedba13d1f dans le forum Logiciel - Software - Open Source
    Réponses: 18
    Dernier message: 21/06/2009, 12h55
  5. langage C : problème avec scanf
    Par invitedba13d1f dans le forum Logiciel - Software - Open Source
    Réponses: 20
    Dernier message: 20/04/2009, 17h41