Erreur de la saisir du caractère avec scanf
Résolu
sincemouhamed741
Messages postés
17
Statut
Membre
-
sincemouhamed741 Messages postés 17 Statut Membre -
sincemouhamed741 Messages postés 17 Statut Membre -
A voir également:
- Scanf caractere c
- Caractère ascii - Guide
- Caractère spéciaux - Guide
- Caractere speciaux - Guide
- Caractere vide - Guide
- Caractere speciaux mac - Guide
1 réponse
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 :
puis il suffit d'appeler
Dal
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
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 :-)
<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>