C++ プログラムで、演算子 (+ - / *) が散在する整数オペランドで構成されるユーザー入力を処理しようとしています。各演算子の前後に空白を入れることをユーザーに要求する余裕があります。私のアプローチは、int でないものはすべて演算子であると想定することです。したがって、ストリームで eof 以外のエラーが発生するとすぐに、cin.clear() を呼び出して、次の値を文字列に読み込みます。
#include <iostream>
#include <string>
//in some other .cpp i have these functions defined
void process_operand(int);
void process_operator(string);
using namespace std;
int main()
{
int oprnd;
string oprtr;
for (;; )
{
while ( cin >> oprnd)
process_operand(oprnd);
if (cin.eof())
break;
cin.clear();
cin >> oprtr;
process_operator(oprtr);
}
}
これは / および * 演算子では問題なく機能しますが、+ - 演算子では機能しません。その理由は operator>>
、エラーを報告する前に + または - を食い尽くし、それをストリームに戻さないためです。そのため、無効なトークンが oprtr に読み込まれます。
Ex: 5 1 * 2 4 6 * / works fine
5 1 + 2
^ ---> 2 becomes the oprnd here.
この問題に対処する C++ の良い方法は何でしょうか?