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
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
A voir également:
- Veuillez saisir les caractères 2-25 qui incluent
- Rech. ou saisir l'url - Guide
- +33 2 70 00 25 84 ✓ - Forum Mobile
- Caractères ascii - Guide
- Caractères spéciaux clavier azerty - Guide
- Caractères spéciaux - Guide
1 réponse
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié le 15 mars 2018 à 11:34
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 :
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
15 mars 2018 à 13:34
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 :-)
15 mars 2018 à 18:29
<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>