2016-11-26 2 views
0

Je suis relativement nouveau à la programmation et j'expérimentais quelques codes du livre de Bjarne sur les principes et la pratique en utilisant C++.pourquoi le besoin de cin.unget() dans ce contexte, C++?

Je voudrais savoir pourquoi est-il nécessaire de cin.unget() lorsque l'entrée n'est pas un nombre entier alors que cin.unget() n'est pas nécessaire lorsque l'entrée est un nombre entier?

Notez que ce code n'est pas parfait car l'auteur tente simplement d'illustrer certains pointeurs sur l'entrée et la sortie des utilisateurs. Le code est le suivant:

void skip_to_int() 
{ 
    if (cin.fail()){ 
     cin.clear(); 
     for (char ch; cin>>ch;) { // throw away non-digits 
      if (isdigit(ch) || ch=='-') { 
       cin.unget(); 
       return; 
      } 
     } 
    } 
    error("no input"); 
} 

int main(){ 
    cout << "Please enter an integer in the range 1 to 10(inclusive):\n"; 
    int n = 0; 
    while (true) { 
     if (cin>>n) { // we got an integer; now check it 
      if (1<=n && n<=10) break; 
      cout << "Sorry " << n 
      << " is not in the [1:10] range; please try again\n"; 
     } 
     else { 
      cout << "Sorry, that was not a number; please try again\n"; 
      skip_to_int(); } 
    } 
} 

Répondre

0

Il scanne à travers votre flux d'entrée pour trouver des chiffres ou - qui fait partie d'un chiffre négatif sans doute. C'est une façon plutôt curieuse d'enlever des choses comme des espaces ou des onglets.

La raison pour unget() est de repousser ce caractère dans le flux afin qu'il puisse être analysé plus tard avec cin>>n. Si vous l'avez consommé et jeté, il ne serait pas disponible à ce moment-là.