2017-10-11 4 views
1

En traitant de la lecture de différents types d'entrées de cin, j'ai pensé à l'origine à commencer à lire comme si l'entrée était un nombre entier. Si cela échoue, lisez-le en tant que chaîne.lecture de différents types d'entrée à partir de cin

Cela fonctionne bien jusqu'à ce que j'ai essayé de lire des opérateurs tels que "+", "-". Après avoir entré le if (! Fail), il demande une autre entrée comme si l'entrée (les opérateurs tels que "+", "-") est parti. Bien que, l'entrée ne devrait même pas été lu dans

Voici le code:.

void RPNCalc::run() 
{ 
    int numInput; bool boolInput = false; string stringInput; char charInput; 
    while (stringInput != "quit") 
    { 
     cin >> numInput; 
     if (!cin) 
     { 
      cout << "not an int" << endl; 
      cin.clear(); 
      cin >> stringInput; 
      cout << stringInput << endl; 
      readNonNumInput(stringInput, boolInput); 
     } 
     else 
     { 
      Datum temp = Datum(numInput); 
      calculator.push(temp); 
     } 
    } 
} 

Lors de la lecture des opérateurs en cin, après ne le lire comme un entier, il perd en quelque sorte les opérateurs dans le tampon. Par exemple, si j'entre un "+", il ne peut pas être lu comme un entier, donc il affichera l'instruction "pas un int". Cependant, puisque le "+" est en quelque sorte perdu dans le tampon, il n'y a rien à lire dans le stringInput. Alors que pour les autres entrées de chaîne, il ne peut pas être lu comme des entiers et cette chaîne existe toujours dans le tampon, qui peut ensuite être lu dans le stringInput.

C'est ce que je comprends de ce qui se passe ici. Mais je peux me tromper.

Répondre

1

Lit toujours une chaîne, puis essaie de la convertir. "+/-" sont consommés pendant que vous essayez de lire un nombre, car ils peuvent faire partie de la représentation sous forme de chaîne d'un nombre