Comment attraper une entrée non valide en c++?
Je suis (un peu) connu python programmeur d'essayer de migrer vers C++. Je veux être capable d'attraper entrée utilisateur non valide. Par exemple, si une variable nécessite un entier, et que l'utilisateur saisit une chaîne de caractères, je veux rattraper cette erreur. En python 3, la syntaxe est la suivante:
try:
#block of code you want to run
except ValueError:
#Block of code to be run if the user inputs an invalid input
En c++, j'ai lu que la syntaxe est Try, catch. Je suis en train de le faire, mais sa ne fonctionne pas. voici mon code en c++:
#include "Calculator.h"
#include <iostream>
#include <exception>
using namespace std;
Calculator::Calculator()
{
}
int Calculator::Calc()
{
cout << "Enter a number " << endl;
try
{
cin >> a;
}
catch (logic_error)
{
cout << "An error has ocurred! You have entered an invalid input!"
}
Comment puis-je attraper une entrée non valide en c++? Oui, je suis en utilisant un fichier d'en-tête pour cette classe. Si vous avez besoin de ces matières, laissez-moi savoir. Je vais continuer à chercher sur le web et après si j'ai trouvé une réponse!
- Je ne voudrais pas utiliser les exceptions pour valider la saisie de l'utilisateur. Je voudrais choisir la méthode de conversion appropriée pour, disons, de string en int, et le message que l'utilisateur en cas d'échec de la validation, puis reprompt pour l'entrée.
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de
#include <limits>
Il y a un modèle pour vous.
using namespace std;
. Vous pouvez omettre chaque occurrence destd::
de ma réponse aussi longtemps que vous êtesusing namespace std;
, mais les gens vont vous direusing namespace std;
est une mauvaise pratique.#include <limits>
from Foo import *
chaque fois que vous importez un module. Finalement, vous obtiendrez un conflit de nom, appelez la fonction incorrecte, etc. À l'aide destd::
partout, c'est souvent trop lourde, de sorte qu'un bon équilibre est àusing namespace std;
seulement à l'intérieur des fonctions, ouusing std::cin; using std::cout
sélective de porter des noms à l'espace de noms global.Par défaut, C++ ruisseaux, ne pas jeter sur mal formée d'entrée: il n'est pas exceptionnel que l'entrée est incorrect. Il est normal. Le C++ approche à indiquer d'entrée de l'échec est de mettre le ruisseau en état d'échec, c'est à dire, pour définir l'état du pavillon
std::ios_base::failbit
. La façon la plus simple pour tester la saisie erronée est d'utiliser quelque chose commeTraitant de l'erreur de saisie généralement les montants de compensation du ruisseau de l'état (tant que c'est des modes de défaillance et de ne pas traiter le flux réel) et ensuite à
ignore()
un ou plusieurs de la délinquance caractères.Si vous voulez vraiment obtenir une exception, vous pouvez définir un masque d'exception:
Chaque fois que
in.exceptions() & in.rdstate()
est non-zéro à la fin de l'un des membres concernant l'état des bits ou le masque d'exception est appelé une exception (c'est à dire l'appel dein.exception(std::ios_base::failbit)
peut lever une exception). L'exception est de typestd::ios_base::failure
.Je recommande pas d'utiliser l'exception des installations dans IOStreams! Les erreurs de saisie sont normales et les exceptions sont pour, ainsi, exceptionnelle des erreurs. À l'aide de la conversion à
bool
après avoir lu une valeur fonctionne plutôt bien.Ruisseaux, ne pas jeter des exceptions par défaut (il peut être configuré pour le faire).
Le code habituel de lire un int est:
Mais être sûr que vous savez ce
>>
ne fait ici. Plus précisément, les nouveaux arrivants au C++ sont parfois surpris de constater que ce n'est pas nécessairement lire une ligne entière. Donc, si vous voulez valider l'ensemble de la ligne de saisie, ou si vous voulez réessayer en cas d'échec alors vous avez besoin de plus de code.