Petit Probleme en C (scanf ???)
Résolu/Fermé
A voir également:
- Petit Probleme en C (scanf ???)
- Petit colis distribution - Forum Réseaux sociaux
- Excel trier du plus grand au plus petit - Guide
- Petit 1 comme ² ✓ - Forum Bureautique
- Ecrire les chiffres en petits caractères ✓ - Forum Windows
- Comment retourner un colis - Forum Consommation & Internet
6 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
3 janv. 2010 à 14:45
3 janv. 2010 à 14:45
Salut,
Il faut penser à vider le buffer clavier.
Voici une solution possible avec scanf :
Si tu veux utiliser fgets, tu devras convertir le nombre avec strtol et tester si la conversion est correcte et que le nombre se trouve entre 0 et 5.
Dans les deux cas, tu devras vider le '\n' du buffer.
Cdlt
Il faut penser à vider le buffer clavier.
Voici une solution possible avec scanf :
#include <stdio.h> static void videBuf(void) { int c; while((c=getchar())!='\n' && c !=EOF); } int main(void) { int a; int err=0; while(err<0 || a<0 || a>5) { printf("nb entre 0 et 5: "); fflush(stdout); err=scanf("%d",&a); videBuf(); } printf("nb=%d\n",a); return 0; }
Si tu veux utiliser fgets, tu devras convertir le nombre avec strtol et tester si la conversion est correcte et que le nombre se trouve entre 0 et 5.
Dans les deux cas, tu devras vider le '\n' du buffer.
Cdlt
happy_girl
Messages postés
111
Date d'inscription
vendredi 7 novembre 2008
Statut
Membre
Dernière intervention
26 juillet 2012
1
3 janv. 2010 à 14:51
3 janv. 2010 à 14:51
je vois pas que ça sera une boucle infinie puisque une fois l'utilisateur entre un nombre plus grand que 5 alors c là ou on dois re donner à l'utilisateur la main pour taper un nouveau nombre .
bn le code que je propose c comme suit:
while(exemple.duree >5 || exemple.duree < 0 ){
printf("Note du morceau [0-5] ? \n");
fgets(exemple.duree,TL,stdin);
}
NB: je ne suis pas sur si 'exemple.duree' est la bonne variable à tester mais bn ça doit marcher
bn chance
bn le code que je propose c comme suit:
while(exemple.duree >5 || exemple.duree < 0 ){
printf("Note du morceau [0-5] ? \n");
fgets(exemple.duree,TL,stdin);
}
NB: je ne suis pas sur si 'exemple.duree' est la bonne variable à tester mais bn ça doit marcher
bn chance
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
3 janv. 2010 à 14:58
3 janv. 2010 à 14:58
Attention, tu confonds un nombre avec un char*.
fgets attend un char*. Donc exemple.duree>5 ne pourra pas marcher. Il faut au préalable convertir la chaîne en nombre.
fgets attend un char*. Donc exemple.duree>5 ne pourra pas marcher. Il faut au préalable convertir la chaîne en nombre.
happy_girl
Messages postés
111
Date d'inscription
vendredi 7 novembre 2008
Statut
Membre
Dernière intervention
26 juillet 2012
1
3 janv. 2010 à 15:11
3 janv. 2010 à 15:11
voila ta raison, j'ai dis que je sais pas si la variable que j'ai utlisé est la bonne ou pas :::D
merci pour la remarque et bn chance
merci pour la remarque et bn chance
Utilisateur anonyme
3 janv. 2010 à 15:13
3 janv. 2010 à 15:13
Salut,
Il faut donc que je recupere l'information de stdin dans exemple.note (au final ^^) g defini defini dans ma structure que exemple.note etait un int.
Donc, il faut que je converti la chaine en int par la fct strtol ?
Ou je change ma structure ?
Merci encore.
Il faut donc que je recupere l'information de stdin dans exemple.note (au final ^^) g defini defini dans ma structure que exemple.note etait un int.
Donc, il faut que je converti la chaine en int par la fct strtol ?
Ou je change ma structure ?
Merci encore.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
3 janv. 2010 à 15:26
3 janv. 2010 à 15:26
Dans ta structure, tu stockes l'élément au plus propre. Une note est un entier. Donc tu le définis en tant qu'entier. Ensuite, pour récupérer la note, tu as deux choix. Soit tu passes par un buffer (donc un tableau supplémentaire), tu lis le buffer via fgets(buffer, sizeof buffer,stdin); et tu convertis le buffer en long via strtol.
Soit tout simplement, tu passes par scanf directement en faisant les vérifications que j'ai utilisées dans mon exemple. T'as juste à remplacer ma variable "a" par exemple.note. Et ça devrait marcher.
Soit tout simplement, tu passes par scanf directement en faisant les vérifications que j'ai utilisées dans mon exemple. T'as juste à remplacer ma variable "a" par exemple.note. Et ça devrait marcher.
Utilisateur anonyme
3 janv. 2010 à 15:40
3 janv. 2010 à 15:40
MERCI !!
Grace a toi sa marche ^^ !!
Je poste le code:
J'ai une derniere question au sujet de la fonction rename je poste cela dans un autre topic.
^^
Grace a toi sa marche ^^ !!
Je poste le code:
//(mettre en debut le code du videBuf()) int err=0; while (err<0 || exemple.note<0 || exemple.note>5) { printf("Note du morceau ? [0-5]\n"); fflush(stdout); err=scanf("%d",&(exemple.note)); videBuf(); }
J'ai une derniere question au sujet de la fonction rename je poste cela dans un autre topic.
^^