cin >> i erreur dans l’entrée avec le symbole +

Dans un programme C ++, j’essaie de traiter une entrée utilisateur composée d’opérandes entiers entrecoupés d’opérateurs (+ – / *). J’ai le luxe d’exiger des utilisateurs qu’ils mettent des espaces avant et après chaque opérateur. Mon approche est de supposer que tout ce qui n’est pas un int est un opérateur. Ainsi, dès qu’il y a une erreur non eof sur le stream, j’appelle cin.clear () et lit la valeur suivante dans une chaîne.

#include  #include  //in some other .cpp i have these functions defined void process_operand(int); void process_operator(ssortingng); using namespace std; int main() { int oprnd; ssortingng oprtr; for (;; ) { while ( cin >> oprnd) process_operand(oprnd); if (cin.eof()) break; cin.clear(); cin >> oprtr; process_operator(oprtr); } } 

Cela fonctionne bien pour les opérateurs / et * mais pas pour les opérateurs + -. La raison en est que l’ operator>> ronge le + ou le – avant de signaler l’erreur et ne la remet pas dans le stream. Je reçois donc un jeton invalide dans oprtr.

 Ex: 5 1 * 2 4 6 * / works fine 5 1 + 2 ^ ---> 2 becomes the oprnd here. 

Quel serait un bon moyen C ++ de traiter ce problème?

Lisez std::ssortingng s et convertissez-les en utilisant boost::lexical_cast<> ou son équivalent.

 int main() { ssortingng token; while ( cin >> token) { try { process_operand(boost::lexical_cast(token)); } catch (std::bad_cast& e) { process_operator(token); } } } 

Postscript : Si vous êtes allergique à Boost, vous pouvez utiliser cette implémentation de lexical_cast:

 template  T lexical_cast(const U& u) { T t; std::ssortingngstream s; s << u; s >> t; if( !s ) throw std::bad_cast(); if( s.get() != std::ssortingngstream::traits_type::eof() ) throw std::bad_cast(); return t; } 

Je pense que >> pense que vous commencez un autre entier avec +/-. Puis se fâche quand vous ne suivez pas avec les chiffres.

Comme @ Robᵩ a dit, lisez une chaîne et lancez. Je voudrais seulement offrir un autre choix de la bibliothèque standard:

 int stoi(const ssortingng& str, size_t *idx = 0, int base = 10); 

Cela jette invalid_argument si aucune conversion ne peut être effectuée ou out_of_range si la valeur convertie est en dehors de la plage de valeurs pouvant être représentées pour le type de retour.

Ceci est de la norme.

Je ne connais pas la méthode C ++, mais celle-ci consisterait à lire des chaînes et à utiliser atoi pour convertir des entiers.