Petit Probleme en C (scanf ???)
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour à tous et avant tout Bonne Année :p
J'essaye depuis hier de trouver une solution pour reussir a faire rentrer a l'utilisateur du programme une reponse *valide* a savoir :(voici le code):
printf("Titre du morceau ? \n");
fgets(exemple.titre,TL,stdin); //demande le titre la sa va
printf("Artiste du morceau ? \n");
fgets(exemple.artiste,TL,stdin);
printf("Note du morceau [0-5] ? \n");
fgets(exemple.duree,TL,stdin); //ICI je veux que l'utilisateur ne rentre uniquement qu'une note entre [0-5]
J'avais pensé au scanf avec une boucle while mais je n'y arrive pas (j'obtient une boucle infinie)
Voilà.
Merci d'avance. ^^
J'essaye depuis hier de trouver une solution pour reussir a faire rentrer a l'utilisateur du programme une reponse *valide* a savoir :(voici le code):
printf("Titre du morceau ? \n");
fgets(exemple.titre,TL,stdin); //demande le titre la sa va
printf("Artiste du morceau ? \n");
fgets(exemple.artiste,TL,stdin);
printf("Note du morceau [0-5] ? \n");
fgets(exemple.duree,TL,stdin); //ICI je veux que l'utilisateur ne rentre uniquement qu'une note entre [0-5]
J'avais pensé au scanf avec une boucle while mais je n'y arrive pas (j'obtient une boucle infinie)
Voilà.
Merci d'avance. ^^
A voir également:
- Petit Probleme en C (scanf ???)
- Comment imprimer une photo en petit ✓ - Forum Photo numérique
- Petit 2 ✓ - Forum Bureautique
- Imprimer une photo à la taille qu'on veut? - Forum Photo numérique
- Trier du plus petit au plus grand excel - Guide
- Petit 3 ✓ - Forum Word
6 réponses
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
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
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
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
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.
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.
^^