Petit Probleme en C (scanf ???)

Résolu/Fermé
Utilisateur anonyme - 3 janv. 2010 à 14:25
 Utilisateur anonyme - 3 janv. 2010 à 15:40
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. ^^

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
Salut,
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
2
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
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
0
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
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.
0
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
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
0
Utilisateur anonyme
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.
0

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
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.
0
Utilisateur anonyme
3 janv. 2010 à 15:40
MERCI !!
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.
^^
0