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
A voir également:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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