2009-08-16 11 views
4

J'ai des problèmes avec certaines zones d'entrée de mon programme. Il y a quelques parties où l'utilisateur entre un entier spécifique. Même s'ils entrent dans le mauvais qui est tout bon et dandy, mais j'ai remarqué que s'ils entraient n'importe quoi pas de type entier comme 'm' alors il bouclera le message d'erreur à plusieurs reprises.Entrée utilisateur des entiers - Traitement des erreurs

J'ai quelques fonctions qui ont une entrée entière. En voici un pour un exemple.

void Room::move(vector<Room>& v, int exone, int extwo, int exthree, int current) 
{ 
    v[current].is_occupied = false; 
    int room_choice; 
    cout << "\nEnter room to move to: "; 
    while(true) 
    { 
     cin >> room_choice; 
     if(room_choice == exone || room_choice == extwo || room_choice == exthree) 
     { 
      v[room_choice].is_occupied = true; 
      break; 
     } 
     else cout << "Incorrect entry. Try again: "; 
    } 
} 

[RESOLU]

void Room::move(vector<Room>& v, int exone, int extwo, int exthree, int current) 
{ 
    v[current].is_occupied = false; 
    int room_choice; 
    cout << "\nEnter room to move to: "; 
    while(true) 
    { 
     cin >> room_choice; 
     if(room_choice == exone || room_choice == extwo || room_choice == exthree) 
     { 
      v[room_choice].is_occupied = true; 
      break; 
     } 
     else if(cin.fail()) 
     { 
      cin.clear() 
      cin.ignore() 
      cout << "Incorrect entry. Try again: "; 
     } 
    } 
} 
+3

Aaarrgh !!! Pourquoi les professeurs continuent-ils à assigner ces stupides exercices d'E/S sur console? –

Répondre

6

Vous pouvez utiliser cin.good() ou cin.fail() pour déterminer si cin pourrait traiter avec succès la valeur d'entrée fournie. Vous pouvez ensuite utiliser cin.clear(), si nécessaire, pour effacer l'état d'erreur avant de poursuivre le traitement.

+0

Ouais, j'ai effectivement essayé d'utiliser cin.clear() pour effacer le tampon mais cela n'a rien changé. Je vais essayer vos autres suggestions cependant. – trikker

+0

La recherche de cin.fail() et l'utilisation de cin.ignore() et cin.clear() ont corrigé les problèmes. Merci. – trikker

+0

cin.sync() pourrait être utile aussi ... il supprimerait tous les caractères non lus –

9

Il y a toujours un problème dans votre code "résolu". Vous devriez vérifier fail() avant de vérifier les valeurs. (Et évidemment, il y a le problème de l'échec d'eof() et d'IO par opposition aux problèmes de format).

lecture idiomatiques est

if (cin >> choice) { 
    // read succeeded 
} else if (cin.bad()) { 
    // IO error 
} else if (cin.eof()) { 
    // EOF reached (perhaps combined with a format problem) 
} else { 
    // format problem 
} 
+1

C'est absolument la bonne façon de le faire. –

+0

Mais peu importe combien de fois il est souligné, les gens insistent pour le faire dans le mauvais sens. J'ai un peu abandonné là-dessus :-( –

+0

Merci AProgrammer. – trikker

1

Pour une façon encore plus simple, vous pouvez utiliser l'opérateur ! comme ceci:

 if (!(cin >> room_choice)) 
     { 
      cin.clear(); 
      cin.ignore(); 
      cout << "Incorrect entry. Try again: "; 
     } 
Questions connexes