am Nouveau pour programmer des excuses si j'ai fait quelque chose de stupide.
J'essaie de créer un programme en C qui lit un numéro de point flottant de l'utilisateur et l'imprime s'il s'agit d'un flotteur valide entre les valeurs de 0 et 20, sinon elle demandera à nouveau. p>
Le code ressemble à ceci: p> Si je saisi un numéro, il fonctionne comme prévu. Cependant, si je saisi quelque chose d'autre (tel qu'un personnage), il se casse et imprime à plusieurs reprises le message. P> Qu'est-ce que j'ai fait de mal? J'ai lu dans un autre fil que je peux utiliser la valeur de retour de Scanf pour vérifier que
L'entrée est du type de données prévu mais qui ne semble pas fonctionner ici. p> p>
3 Réponses :
Si l'entrée est structurée en lignes, vous pouvez utiliser la logique suivante
float result ;
for ( ;; ) { // loop forever
printf("Please input ...\n") ;
char buff[256] ;
if ( fgets(buff, sizeof(buff), stdin) ) {
if ( sscanf(buff, "%f", &result) == 1 ) {
// additional verification on result
if ( result >=0 && result <= 20 ) break ;
} ;
} ;
} ;
// Use Result here
Ceci est arrivé car scanf () n'efface pas l'entrée non valide. Il est préférable d'utiliser quelque chose comme get () ou des fgets () et essayez de convertir en float en utilisant quelque chose comme Atof ().
Si vous devez utiliser scanf (), effacer la saisie invalide manuellement par quelque chose comme ceci: p>
Essayez de lire l'entrée sur un tampon à chaîne (en utilisant Notez que pour la vérification de votre plage, notez que La comparaison de points flottants n'est pas triviale en raison de la représentation interne des nombres. p> p> fgets code>), puis convertissez ce tampon de chaîne au numéro de point flottant souhaité (à l'aide de SSCANF code>). De cette façon, vous pouvez également effectuer des contrôles supplémentaires sur la chaîne d'entrée et donner à l'utilisateur des messages d'erreur significatifs pour des entrées de mauvaises entrées. sscanf code> sera satisfait une fois qu'elle a rempli ses arguments, il acceptera également des chaînes telles que "2x" (comme numéro 2.0). p>
Le meilleur conseil serait pas i> à Utilisez
scanf code>. La raison pour laquelle vous obtenez est quescanf code> ne retire pas la mauvaise entrée du flux, de sorte que vous vous retrouviez avec la lecture et la lecture.Vérifiez la valeur de retour de
scanf code>. Toutes les saisies de l'utilisateur sont une chaîne de toute façon, il est justescanf code> analyse des flotteurs en dehors de celui-ci.scanf code> retournera un int, correspondant au nombre de valeurs lues avec succès.Il peut être préférable de ne pas penser en termes de mot "type" mais plutôt en termes de format d'entrée. L'entrée fournie est-elle un format accrétable? Lorsque des moyens «acceptables» peuvent être interprétés à une valeur de point flottante. Ou mieux peut être interprété dans tout (c'est-à-dire avec rien de gauche) comme une valeur de point flottante. Pourquoi? Parce que l'entrée utilisateur est texte i>. Tout cela si vous travaillez à partir de la ligne de commande. L'utilisateur ne tapit pas un
float code> ou unint code>, ils tapent texte i>. Ensuite, vous traitez d'une manière ou d'une autre à la mise en place d'une interprétation.