Si je puis me permettre de compléter ce qui a été avancé par romantik
La fonction scanf peut avoir un comportement assez délicat à comprendre au début.
Voici une explication du fonctionnement de scanf pas à pas pour un code caricatural :
int a, b;
char c;
printf("entrez un premier entier : ");
scanf("%d", &a);
printf("vous avez entré : %d\n", a);
printf("entrez un second entier : ");
scanf("%d", &b);
printf("vous avez entré : %d\n", b);
printf("entrez un caractere : ");
scanf("%c", &c);
printf("fin du programme");
Quand tu fais des scanf dans ton code, tu remarques bien que tu appuies sur "Entrée" pour valider ta saisie. Cela rajoute un '\n' dans le tampon de stdin (la petite zone mémoire dans laquelle tu écris et que scanf va lire).
Principe : quand scanf lit le tampon de stdin, si un '\n' se trouve au début, elle l’ignore presque toujours et se concentre sur ce qui vient ensuite. Ce n’est justement pas le cas quand on cherche à lire un caractère ! Dans ce deuxième cas, elle va tout simplement récupérer le '\n' (généralement non souhaité).
Deuxième principe : scanf n’enlève pas le '\n' à la fin du tampon car elle n’en a pas besoin.
Donc dans le code en exemple, lors du premier scanf, scanf lit le premier entier sans avoir à ignorer de '\n' initial car le tampon est vide avant le premier appel à scanf. Pour le deuxième entier, elle voit un '\n' au début, elle le lit (donc l’enlève du buffer) l’ignore car elle recherche un entier. Elle extrait normalement le second entier et laisse encore un '\n' dans le tampon. Finalement quand scanf veut récupérer un char, elle prend le '\n' qui est déjà là et pouf le programme est fini :/
RECOMMANDATION : lors d’un appel habituel à scanf (pour des entiers, des chaines de caractères, etc.), il faut faire un getchar() juste après. Cela permet de lire le '\n' et donc de vider le buffer pour ne pas avoir d’ennui ensuite.
AUTRE POSSIBILITE : si tu n’aimes pas getchar partout, plutôt que de récupérer un char, tu fais ceci :
char chaine[2];
printf("entrez caractère : ");
scanf("%1s", chaine);
et ton caractère se trouve être le premier élément de ta chaine. En effet lors de la lecture d’une chaine de caractères, scanf ignore le '\n' initial comme elle le fait habituellement
Pour plus d’infos sur scanf : https://xrenault.developpez.com/tutoriels/c/scanf/
Il y a aussi quelques explications sur le fonctionnement de scanf dans le tutoriel sur le langage C