Bonjour, je suis entrain de faire un programme qui demande à l'utilisateur d'entrer un nombre mais je veux être sur que l'utilisateur n'entre pas autre chose donc je voulais savoir si il existait une sorte de fgets pour les int.
Et puis il faudrait peut-être expliquer pourquoi ça assure que l'utilisateur n'entre pas autre chose qu'un nombre. Pour ça, il faut récupérer le retour de 'scanf' et vérifier qu'il est égal à 1. Si ce n'est pas le cas, il faut probablement vider le tampon. (Il me semble.)
Et puis il faudrait peut-être expliquer pourquoi ça assure que l'utilisateur n'entre pas autre chose qu'un nombre. Pour ça, il faut récupérer le retour de 'scanf' et vérifier qu'il est égal à 1. Si ce n'est pas le cas, il faut probablement vider le tampon. (Il me semble.)
(ox223252 : tu as oublié de corriger...)
- Edité par robun il y a environ 10 heures
Qu'est ce que le tampon ?
En tout cas merci pour vos réponses je vais aller me renseigner sur fscanf
Le tampon est ce qui stocke les valeurs entrées au clavier. Si on n'entre pas un nombre, la fonction 'scanf' retourne 0 et ne peut pas affecter la variable, du coup le tampon reste plein et sera utilisé pour le prochain 'scanf'.
On peut tester ça avec un petit programme de ce genre :
/*
* TEST DU TAMPON
* On doit entrer un entier puis le programme affiche cet entier.
* Si on n'a pas rentré un entier, il affiche -9999.
* De plus il affiche ce qui reste dans le tampon (ce qui le vide).
*/
#include <stdbool.h>
#include <stdio.h>
void affiche_tampon()
{
int c ;
printf("\tTampon : ") ;
while ((c = getchar()) != EOF && c != '\n')
{
printf("%c", c) ;
}
printf("\n") ;
}
int main(void)
{
do
{
// Saisie de la valeur :
printf("Entrer un nombre entier (0 pour quitter) : ") ;
int valeur = -9999 ;
int nb_conv = scanf("%d", &valeur) ;
if (valeur == 0) break ;
// Affichage du résultat de 'scanf' :
printf("\t%d valeur convertie correctement\n", nb_conv) ;
printf("\tValeur saisie = %d\n", valeur) ;
// Affichage du tampon :
affiche_tampon() ;
} while (true) ;
return 0 ;
}
Examiner ce qui se passe lorsqu'on saisit un nombre à virgule, du texte, ou du texte commençant par un nombre. En tout cas, on voit qu'on a un moyen de tester que l'utilisateur entre bien un nombre entier (la valeur de retour de la fonction 'scanf').
Le tampon est un tableau de caractères qui contient (pour stdin) les caractères que l'utilisateur a entrés,
Plus précisément, quand on tape une ligne, ça va dans le tampon. Et c'est consommé par les scanf. Si on fait un scanf("%d",...) pour lire un nombre, scanf regarde d'abord si il reste des choses non consommees dans le tampon. Si il n'y en a pas il attend que l'utilisateur tape une ligne, par exemple 123 abc [entree] qui est mise dans le tampon.
Avec %d, scanf saute tous les espaces. Si il finit par tomber sur un chiffre, ou un signe, c'est bon, c'est le début d'un nombre entier. Tous les chiffres suivants sont alors utilisés pour fabriquer la valeur du nombre. On finit par tomber sur autre chose, ici un espace. Le pointeur de lecture mémorise qu'on en est là.
Si on fait ensuite un scanf("%s", ...), c'est quasiment pareil : on saute l'espace, puis on recopie tous les caractères qui ne sont pas des espaces. Ça s'arrete donc sur le caractère de fin de ligne.
Si on lit ensuite un caractère, %c, on récupère ce qui reste dans le tampon : le caractère '\n'.
du coup cela permet de faire en sorte que si l'utilisateur entre un caractere autre qu'un nombre, le programme ne plante pas ?
parce que dans mon programme du jeu plus + ou - dès que j'entre une lettre dans le scanf(qui demande un int), le programme bug et ça me fait une boucle infini qui me dit d'entrer un nombre entre 1 et 100
Oui, à condition de contrôler la sortie. Dans l'exemple que j'ai donné plus haut, j'affichais nb_conv = le nombre de variables converties correctement. Comme la fonction scanf était appelée avec un argument, ce nombre vaut soit 0, soit 1. S'il vaut 0, c'est qu'il y a eu une erreur et il faut recommencer. On peut ainsi imaginer ce genre de chose (je n'ai pas testé, c'est juste une idée) :
int valeur ; // valeur à saisir
bool lecture_valide ; // ==vrai si on a saisi correctement un 'int'
do
{
printf("Entrer un nombre entier : ") ;
int nb_conv = scanf("%d", &valeur) ;
lecture_valide = (nb_conv == 1)
if (! lecture_valide)
{
printf("Erreur de saisie, veuillez recommencer.\,") ;
vider_tampon() ;
}
} while (! lecture_valide) ;
Principe : on demande à l'utilisateur une valeur tant qu'il n'a pas entré une valeur valide. À noter que si la valeur n'est pas valide, il faut vider le tampon en appelant une fonction que je n'ai pas écrite (c'est à cause du tampon non-vidé que tu as une boucle infinie : il reste la valeur invalide dans le tampon, du coup elle est lue sans attendre que tu tapes quelque chose au clavier, mais elle est invalide aussi elle reste dans le tampon, du coup elle est lue sans attendre que tu tapes quelque chose au clavier, mais elle est invalide aussi elle reste dans le tampon, du coup elle est lue sans attendre que tu tapes quelque chose au clavier, mais elle est invalide aussi elle reste dans le tampon...)
---------------------
On pourrait même en faire une fonction qui serait utilisable pour plusieurs saisies :
void lire_int(pvaleur, char prompt[], char msgerr[])
// pvaleur : pointeur sur la valeur à saisir
// prompt : phrase à afficher avant la saisie
// msgerr : message d'erreur
{
bool lecture_valide ; // ==vrai si on a saisi correctement un 'int'
do
{
printf("%s", prompt) ;
int nb_conv = scanf("%d", pvaleur) ;
lecture_valide = (nb_conv == 1)
if (! lecture_valide)
{
printf("%s", msgerr) ;
vider_tampon() ;
}
} while (! lecture_valide) ;
}
Merci je viens de finir mon programme mais il me restait juste à régler ce probleme parce que je ne voulais pas que l'utilisateur puisse tout faire planter mon programme si facilement(en ecrivant une lettre)
Y'a t-il un type bool en C ?
je dit ça parce que dans le cours C, il est dit qu'il faut créer un type int et faire if (valeur== 1) mais vu que le cours est assez vieux, je ne sait pas...
je dit ça parce que dans le cours C, il est dit qu'il faut créer un type int et faire if (valeur== 1) mais vu que le cours est assez vieux, je ne sait pas...
Problème traité ici, à partir du message du 15/08 16h47
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub
@zoup merci
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub