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 -
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 6373 Statut Contributeur 1 106
 
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 6373 Statut Contributeur 1 106
 
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 17 Statut Membre
 
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