Erreur de la saisir du caractère avec scanf

Résolu/Fermé
sincemouhamed741 Messages postés 16 Date d'inscription jeudi 15 mars 2018 Statut Membre Dernière intervention 4 novembre 2020 - 15 mars 2018 à 07:08
sincemouhamed741 Messages postés 16 Date d'inscription jeudi 15 mars 2018 Statut Membre Dernière intervention 4 novembre 2020 - 16 mars 2018 à 16:36
Salut ! Je voulais savoir comment faire posé une condition de différence entre un caractère et une lettre. Je sais pas si ses à cause de la condition que le programme ne marche.
Voici le code
La console

1 réponse

[Dal] Messages postés 5931 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 6 octobre 2022 1 016
Modifié le 15 mars 2018 à 11:34
Salut sincemouhamed741,

Poste du code, pas des images, s'il te plaît (entre balises de <code c> </code>).

Ton problème est dû au fait qu'après ta saisie du nom, scanf avec %s ne prend qu'un seul mot, s'arrête au prochain caractère blanc, et laisse le reste dans le tampon mémoire du flux d'entrée stdin.

C'est ainsi que fonctionne scanf

http://www.cplusplus.com/reference/cstdio/scanf/

Dans ton exemple :

- tu saisis "ISSA<Entrée>", après le premier scanf, ISSA passe donc bien dans ta variable, mais stdin contient toujours le caractère correspondant à "Entrée" qui n'est pas pris par scanf
- ton deuxième scanf n'arrête pas l'exécution du programme, car stdin n'est pas vide, et consomme le caractère "Entrée", et ton programme échoue

Pour éviter cela, tu dois vider le tampon mémoire de stdin avant le prochain appel à scanf.

Tu fais cela en consommant le contenu du tampon, par exemple comme indiqué là :

https://c.developpez.com/faq/?page=Gestion-du-clavier-et-de-l-ecran-en-mode-console#Comment-vider-le-buffer-clavier

qui propose de créer une fonction comme cela :

#include <stdio.h> 
  
void clean_stdin(void) 
{ 
    int c; 
  
    do { 
        c = getchar(); 
    } while (c != '\n' && c != EOF); 
}

puis il suffit d'appeler
clean_stdin();
entre deux appels à scanf.

Dal
3
[Dal] Messages postés 5931 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 6 octobre 2022 1 016
15 mars 2018 à 13:34
ton deuxième scanf n'arrête pas l'exécution du programme, car stdin n'est pas vide, et consomme le caractère "Entrée", et ton programme échoue

c'est pour cela que le message d'erreur saute aussi une ligne avant de s'afficher

sinon, ton code de test de comparaison est bon, à condition que l'utilisateur ait une chance de taper le caractère attendu :-)
0
sincemouhamed741 Messages postés 16 Date d'inscription jeudi 15 mars 2018 Statut Membre Dernière intervention 4 novembre 2020
15 mars 2018 à 18:29
Merci Dal pour ta réponse le scanf a marcher mais quand j'entre M sa me dit que la condition est invalide alors que le M faire parti du sexe M ou F
<code c>
#include <stdio.h>
#include <stdlib.h>

int main()
{
void clean_stdin (void)
{
int c;
do
{
c= getchar();
}while (c != '\n' && c != EOF);
}
int age;
char nom[20];
char sex;
printf("Entrez le nom\n");
scanf("%s", nom);
clean_stdin();
printf("Entrez le sexe M ou F \n");
scanf("%c", &sex);
clean_stdin();
while ((sex!='M') || (sex!='m') || (sex!='F') || (sex!='f'))
{
printf("%c est invalid. Veuillez entrer le sexe M pour masculin ou F pour feminin\n",sex);
scanf("%c", &sex);
}
printf("entrez l'age\n");
scanf("%d", &age);
while (age<0)
{
printf("%d ans est invalid. Veuillez entrez un age positif", age);
scanf("%d", &age);
}
if((sex=='M') || (sex=='m'))
{
if (age<12)
{
printf("%s est un garcon, il a %d ans", nom, age);
}
else if (age<18)
{
printf("%s est un adolescent, il a %d ans", nom, age);
}
else
{
printf("%s est un adulte, il a %d ans", nom, age);
}
}
else if((sex=='F') || (sex=='f'))
{
if (age<12)
{
printf("%s est une fille, il a %d ans", nom, age);
}
else if (age<18)
{
printf("%s est une adolescente, il a %d ans", nom, age);
}
else
{
printf("%s est une adulte, il a %d ans", nom, age);
}
}
return 0;
}
</code c>
0
sincemouhamed741 Messages postés 16 Date d'inscription jeudi 15 mars 2018 Statut Membre Dernière intervention 4 novembre 2020
15 mars 2018 à 18:30
j'ai mis le code entre la balise <code c> </code c> mais les couleurs ne sont pas apparus
0
[Dal] Messages postés 5931 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 6 octobre 2022 1 016
Modifié le 15 mars 2018 à 19:17
Ah oui, c'est parce que tu testes en utilisant l'opérateur ou, alors qu'il te faut l'opérateur et dans ton cas.

Donc
while ((sex!='M') && (sex!='m') && (sex!='F') && (sex!='f'))


Les balises de code sont <code c> </code> et pas <code c></code c> comme tu l'as fait.

Pour t'éviter de les taper, tu peux utiliser le bouton suivant de l'interface de réponse du forum et choisir le langage "c" :


Sinon, ta fonction clean_stdin() devrait être définie en dehors de main. Autrement, tu n'écris pas du C standard, même si ton compilateur en accepte la compilation (par exemple gcc le gère comme une extension non standard).


Dal
0
sincemouhamed741 Messages postés 16 Date d'inscription jeudi 15 mars 2018 Statut Membre Dernière intervention 4 novembre 2020
Modifié le 15 mars 2018 à 23:06
Merci ! Dal sa marcher comme tu las dit, ses moi qui est fait l'erreur dans la balise je me suis déjà corrigé.
#include <stdio.h>
#include <stdlib.h>

int main()
{
    void clean_stdin (void)
    {
        int c;
        do
        {
            c= getchar();
        }while (c != '\n' && c != EOF);
    }
    int age;
    char nom[20];
    char sex;
    printf("Entrez le nom\n");
    scanf("%s", nom);
    clean_stdin();
    printf("Entrez le sexe M ou F \n");
    scanf("%c", &sex);
    clean_stdin();
    while ((sex!='M') && (sex!='m') && (sex!='F') && (sex!='f'))
    {
        printf("%c est invalid. Veuillez entrer le sexe M pour masculin ou F pour feminin\n",sex);
        scanf("%c", &sex);
    }
    printf("entrez l'age\n");
    scanf("%d", &age);
    while (age<0)
    {
        printf("%d ans est invalid. Veuillez entrez un age positif", age);
        scanf("%d", &age);
    }
    if((sex=='M') || (sex=='m'))
    {
        if (age<12)
        {
            printf("%s est un garcon, il a %d ans", nom, age);
        }
        else if (age<18)
        {
            printf("%s est un adolescent, il a %d ans", nom, age);
        }
        else
        {
            printf("%s est un adulte, il a %d ans", nom, age);
        }
    }
    else if((sex=='F') || (sex=='f'))
    {
        if (age<12)
        {
            printf("%s est une fille, il a %d ans", nom, age);
        }
        else if (age<18)
        {
            printf("%s est une adolescente, il a %d ans", nom, age);
        }
        else
        {
            printf("%s est une adulte, il a %d ans", nom, age);
        }
    }
    return 0;
}

Mais pourquoi le OU ne marchait pas. Mais a ce que je sache ses quand on utilise Répéter jusque' à dans l'algorithme et que ses lorsqu'on veut la traduire en c qu'on fait la négation de la condition. J'ai mis la fonction clean_stdin (); en avant le main
#include <stdio.h>
#include <stdlib.h>

void clean_stdin (void)
    {
        int c;
        do
        {
            c= getchar();
        }while (c != '\n' && c != EOF);
    }
int main()
{
    int age;
    char nom[20];
    char sex;
    printf("Entrez le nom\n");
    scanf("%s", nom);
    clean_stdin();
    printf("Entrez le sexe M ou F \n");
    scanf("%c", &sex);
    clean_stdin();
    while ((sex!='M') && (sex!='m') && (sex!='F') && (sex!='f'))
    {
        printf("%c est invalid. Veuillez entrer le sexe M pour masculin ou F pour feminin\n",sex);
        scanf("%c", &sex);
    }
    printf("entrez l'age\n");
    scanf("%d", &age);
    while (age<0)
    {
        printf("%d ans est invalid. Veuillez entrez un age positif", age);
        scanf("%d", &age);
    }
    if((sex=='M') || (sex=='m'))
    {
        if (age<12)
        {
            printf("%s est un garcon, il a %d ans", nom, age);
        }
        else if (age<18)
        {
            printf("%s est un adolescent, il a %d ans", nom, age);
        }
        else
        {
            printf("%s est un adulte, il a %d ans", nom, age);
        }
    }
    else if((sex=='F') || (sex=='f'))
    {
        if (age<12)
        {
            printf("%s est une fille, il a %d ans", nom, age);
        }
        else if (age<18)
        {
            printf("%s est une adolescente, il a %d ans", nom, age);
        }
        else
        {
            printf("%s est une adulte, il a %d ans", nom, age);
        }
    }
    return 0;
}

et sa marcher donc sa veut dit qu'on peut écrire des codes en avant ou en dehors du main ? Tu pourrais m'expliquer la condition que tu a poser dans la fonction clean_stdin () et le rôle du getchar;
 
void clean_stdin (void)
    {
        int c;
        do
        {
            c= getchar();
        }while (c != '\n' && c != EOF);
    }

Une fois encore merci Dal !
0