2016-09-02 2 views
1

J'ai un problème avec le code suivant. Je l'utilise dans Xcode (OS X).Comment réinitialiser std :: cin en l'utilisant?

[enlevé mon premier essai de ce code]

Comment entrée de remise std :: cin? J'essaie d'entrer une autre valeur mais je ne peux pas parce que std :: cin ne semble plus fonctionner après ma mauvaise valeur.

UPD2 Dans mon deuxième essai, j'utilise ce code:

for (unsigned char i = 0; i < 5; i++) { 

    int value = 0; 

    std::cout << "\n>> Enter \"value\": "; 
    std::cin >> value; 

    if (std::cin.fail()) { 
     std::cin.clear(); 
     std::cin.ignore(); 
     std::cout << "Error: It's not integer value!\n"; 
    } else { 
     std::cout << "The value format is ok!\n"; 
    } 

    std::cout << "value = " << value << std::endl; 

} 

Ici je viens entrée 5 valeurs dans une boucle. Chaque fois que je le vérifie en cas d'erreur. Quand je mets la mauvaise valeur ("asdf"), std :: cin devient fou et ne fonctionne plus. Je reçois cette sortie:

>> Enter "value": 4 
The value format is ok! 
value = 4 

>> Enter "value": 234 
The value format is ok! 
value = 234 

>> Enter "value": asdfghjkl 
Error: It's not integer value! 
value = 0 

>> Enter "value": Error: It's not integer value! 
value = 0 

>> Enter "value": Error: It's not integer value! 
value = 0 
234 
234 
78 
345 
657 
345 
dsf 
f 

Répondre

4

Vous pouvez utiliser, lorsque la condition, std::cin.fail() arrive:

std::cin.clear(); 
std::cin.ignore(); 

Et puis continuer avec la boucle, avec une déclaration continue;. std::cin.clear() efface les indicateurs d'erreur et en définit de nouveaux, et std::cin.ignore() les ignore effectivement (en les extrayant et en les supprimant).

Sources:

  1. cin.ignore()
  2. cin.clear()
+0

réponse est mis à jour @Galik –

+3

'clear' vide drapeaux d'état d'erreur du flux. Ça ne fait rien avec les personnages. Et 'ignorer' sans arguments ne fera qu'écarter un seul caractère, ce qui signifie que si vous entrez' "asdf" ', il passera en boucle 4 fois, vous disant que votre entrée est mauvaise avant de vous permettre d'entrer à nouveau. Vous devriez faire 'std :: cin :: ignore (std :: numeric_limits :: max(), '\ n')' pour les supprimer jusqu'à la fin de la ligne. –

+0

@BenjaminLindley - J'ai un problème avec "std :: cin :: ignore". J'utilise CLang et il semble qu'il devrait être std :: cin.ignore mais avec un seul param ... – JavaRunner