0
votes

Comment vérifier si l'entrée utilisateur est de type de données correct dans c

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.

Le code ressemble à ceci: xxx

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.

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.

c

3 commentaires

Le meilleur conseil serait pas à Utilisez scanf . La raison pour laquelle vous obtenez est que scanf 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 . Toutes les saisies de l'utilisateur sont une chaîne de toute façon, il est juste scanf analyse des flotteurs en dehors de celui-ci. scanf 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 . Tout cela si vous travaillez à partir de la ligne de commande. L'utilisateur ne tapit pas un float ou un int , ils tapent texte . Ensuite, vous traitez d'une manière ou d'une autre à la mise en place d'une interprétation.


3 Réponses :


0
votes

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


0 commentaires

0
votes

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: xxx


0 commentaires

0
votes

Essayez de lire l'entrée sur un tampon à chaîne (en utilisant fgets ), puis convertissez ce tampon de chaîne au numéro de point flottant souhaité (à l'aide de SSCANF ). 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.

Notez que sscanf sera satisfait une fois qu'elle a rempli ses arguments, il acceptera également des chaînes telles que "2x" (comme numéro 2.0). xxx

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.


0 commentaires