entier de validation de la saisie, comment?
Je vais avoir un problème avec ce que devrait être incroyablement simple code. Je veux prendre un nombre entier compris entre 1 et 3 avec la vérification des erreurs. Il fonctionne très bien pour la vérification des numéros qui sont trop gros ou trop petit, mais quand une alpha/nombre de combinaison est entré, il est coincé dans une boucle infinie. Des Suggestions?
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
int input;
cout << "\nPlease enter a number from 1 to 3:" << endl;
cout << "-> ";
cin >> input;
while(input< 1 || input> 3){
cout << "\n---------------------------------------" << endl;
cout << "\n[!] The number you entered was invalid." << endl;
cout << "\nPlease re-enter a number from 1 to 3" << endl;
cout << "-> ";
cin >> input;
}
cout << "You chose " << input << endl;
}
OriginalL'auteur Rick_Sch | 2012-11-03
Vous devez vous connecter pour publier un commentaire.
Le problème est que:
Sera la cause de la mauvaise bits lorsque vous essayez de lire une non valeur numérique. Après cela toute tentative d'utilisation de la
operator>>
est ignoré en silence.De sorte que le moyen de corriger cela est de tester si le flux est en bon état et si non, alors réinitialiser les indicateurs de l'état et d'essayer de la lire à nouveau. Mais notez que le mauvais d'entrée (à l'origine du problème) est toujours à l'entrée de sorte que vous devez assurez-vous de jeter ainsi.
Pour l'empêcher de rester coincé (ce qui est causé par le mauvais bits définis) lire en une chaîne de caractères, puis utiliser une chaîne de stream pour analyser la saisie de l'utilisateur. Je préfère aussi cette méthode (pour l'utilisateur interactif d'entrée), car elle permet de faciliter la combinaison de différents styles de lecture (c'est à dire combinant
operator>>
etstd::getline()
que vous pouvez les utiliser sur les stringstream).Je ne serais pas d'accord. Lire: Pourquoi le “using namespace std;” considéré comme une mauvaise pratique? L'utilisation de construire est un problème dans la plupart des situations et conduit à l'introduction de bugs lorsque vous maintenez le code qui sont difficiles à repérer et diagnostiquer.
Je suis conscient de tous les problèmes que cela peut entraîner, mais ces problèmes sont limités à l'intérieur d'un rpc fichier source si vous continuez à la section "utilisation" des trucs en dehors de tout fichier d'en-tête. Encore, cela peut conduire à des problèmes, mais dans le code de l'OP, il serait inutile d'être totalement explicite.
une autre chose est, par exemple, de
using Foo::A;
et puis, vous ajoutezusing Bar::A
, il est facile de reconnaître que vous êtes de prendre deux de classe avec le même nom, accessible dans le même champ d'application. La plupart du temps, vous aurez à votreusing
lignes à la même place dans votre rpc, rendant possibles des erreurs faciles à corriger. Ne jamais utiliserusing namespace A;
etusing namespace B;
, avec deux espaces de noms entièrement accessible comme ça, d'avoir des ennuis. Je vais vous donner la point encore, il vaut mieux éviter si vous ne connaissez pas le risque.Merci. Fixe.
OriginalL'auteur Martin York
#include <stdlib.h>
pourstrtol
hmm fonctionne pour moi, même sans l'inclusion. mais je pense que cela pourrait être le moindre de ses problèmes 😉
strtol
- nouveau compilateur voudrais vous dire ceci.OriginalL'auteur pokey909
La plupart de ces réponses comprennent la complexité inutile.
Entrée de validation est un moment idéal pour utiliser un faire-lors de la
Utilisation
numeric_limits<streamsize>::max()
complètement clair latampon après l'échec d'une
cin
.Utilisation
cin.clear()
pour réinitialiser l'échec de drapeau surcin
donc!cin
habitudeévaluez toujours faux.
cin.fail()
est très bien. Toutefois, certains considèrent!cin
plus naturel.de mon post précédent https://stackoverflow.com/a/43421325/5890809
OriginalL'auteur Shan L
Vous avez déclaré d'entrée en tant que int mais quand vous écrivez un caractère alphanumérique pour la saisie, elle va essayer de convertir implicitement en entier. Mais vous la vérification des erreurs à ne pas tenir compte de cela.
Ur problème peut être facilement résolu par un changement dans la boucle while. au lieu de vérifier ce que diriez-vous de vérifier
Que faire si nous devons vérifier si l'entrée est entre 1 et 12000, ou tout simplement à la validation des entrées de voir que l'utilisateur entre un nombre entier et non alphanumérique charabia?
OriginalL'auteur RDismyname