Problème avec entrée utilisateur dans C

Le problème exposé dans ce sujet a été résolu.

Bonjour. Je suis entrain d’apprendre C, je crée un petit programme qui saisit une entrée utilisateur et affiche un message selon l’entrée, mais je ne sais pas pourquoi dans mon dernier "else" je n’arrive pas à saisir quelque chose au lancement du programme. Aidez-moi s’il vous plaît!

#include <stdio.h> 
#include <ctype.h> 

int main(){
	
	char choix;
	
	printf("Voulez-vous passer une commande? O/N. \n");
	
	scanf("%c", &choix);
	
	
	if(tolower(choix) == 'o'){
		printf("Voici votre commande.\n");
	}else if(tolower(choix) == 'n'){
		printf("Aucune commande effectuée. Aurevoir! \n");
	}else{
		printf("Vous n'avez pas fait de choix.\n");
		printf("Voulez-vous passer une commande? O/N. \n");
		
		scanf("%c", &choix);
	}
	return 0;
	
}
+0 -0

Bonjour,

Après ton else, ton programme quitte complètement. Peu importe ce que tu mettras, il va se fermer et effacer toutes les informations en mémoire. Tu souhaites probablement intégrer une boucle.

Je ne m’y connais pas en C, il est possible qu’il y ait aussi autre chose.

+1 -0

Salut,

Je pense également que tu cherches à faire une boucle, je te renvoie à la partie du cours qui les concerne.

J’ajoute simplement que scanf va lire un caractère dans l’entrée, mais va laisser les autres si tu en as rentré plusieurs. Par conséquent, la seconde exécution de scanf va prendre le suivant sans te laisser le temps de réagir et ton programme t’indiquera alors que tu as fait une erreur de saisie tandis que c’était une erreur que tu as faite à l’itération précédente !
Pour éviter ça, avant de lire la saisie tu peux vider le buffer d’entrée.

+2 -0

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

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte