0
votes

C ++ Validation d'entrée - Pourquoi un 0 est-il retourné lorsque je saisie une lettre?

J'ai actuellement une fonction configurée qui demande à l'utilisateur une INT, obtient cela, puis vérifie que l'entrée répond à une certaine spécification. Dans ce cas, il s'attendait à ce que l'entrée soit un entier entre -10 et 100. Dors, si je saisis une chaîne de lettres par exemple. "GFUIWYDUF", la fonction renvoie une 0. Pourquoi cela se produit-il et comment puis-je le réparer? XXX


2 commentaires

cin.ignore () ignore 1 caractère, il serait préférable d'ignorer tout le reste de l'entrée


Lorsque CIN >> Réponse rencontre un caractère qui ne peut pas être interprété comme une valeur int , il cesse de lire et de retourner. Le caractère incriminé est laissé en entrée. Avant C ++ 11, Réponse a été laissé non modifié, car c ++ 11 il est réglé sur zéro. Mieux vaut lire un std :: string à partir de std :: Cin Utilisation de std :: getline () - alors vous pouvez vérifier la chaîne, décider S'il a une entrée qui représente une valeur int (par exemple, des chiffres, des caractères de signe), supprimez tous les caractères étrangers, puis extrayez la valeur intégrale de la chaîne.


3 Réponses :


0
votes

Si vous jouez avec les valeurs d'entrée, vous trouverez que CIN >> scan de gauche à droite jusqu'à ce qu'il trouve une valeur non numérique. Il évalue ensuite les chiffres qu'il a trouvés.

Par exemple, mettant:

57GH5

retourne 57

Si vous ne saisissez que des caractères numériques, vous avez un score de 0.

Si vous CIN >> String à la place, vous pourrez analyser / valider la chaîne et convertir un nombre valide en int


0 commentaires

0
votes

Le problème est que votre boucle de validation pour ce type d'entrée dépend de l'état d'erreur de std :: Cin Code>. Cependant, vous nettoyez cet état d'erreur avant la vérification de la boucle.

Le moyen le plus simple de résoudre ce problème est de déplacer votre lecture de std :: Cin Code> à après le Effacer () Comme ceci: P>

cin >> answer;

while(!cin || answer < -10 || answer > 100) {
    cout << "Invalid Input!" << endl;
    cout << "What is the answer?: " << endl;
    cin.clear();
    cin.ignore();
    cin >> answer;

}


0 commentaires

0
votes

0 est renvoyé comme valeur initiale de réponse

Vous pouvez utiliser cin.fail () pour vérifier si l'entrée est valide. < Pré> xxx


1 commentaires

Ce n'est pas la valeur initiale - il n'y avait pas de valeur initiale. Le 0 est défini par Istream dans le cas d'une défaillance d'analyse.