2016-03-22 18 views
1

私はポストフィックスの電卓をコーディングしようとしていますが、最初に を実行しています:電卓がスペースに遭遇すると、ただちに終了します 秒:非数字(ie-z)は、私がコード化したエラーメッセージを表示しません。ポストフィックスノート電卓

int main() 
{ 

stack <int> calcStack; 
string exp; 
char ans; 
cout << "\nDo you want to use the calculator?" << endl; 
cin >> ans; 
while (ans == 'y') 
{ 
    cout << "\nEnter your exp" << endl; 
    cin >> exp; 
    for (int i = 0; i < exp.size(); i++) 
    { 
     if (isspace(exp[i])) 
     { 

     } 
     else if (isdigit(exp[i])) 
     { 
      int num = exp[i] - '0'; 
      calcStack.push(num); 
     } 
     else 
      doOp(exp[i], calcStack); 
    } 

    while (!calcStack.empty()) 
    { 
     calcStack.pop(); 
    } 

    cout << "\nDo you want to use the calculator again?" << endl; 
    cin >> ans; 
} 

system("pause"); 
return 0; 
} 

これは、文字列抽出して文字列を読んでいる、あなたのメインループでfunction--

void doOp(const char & e, stack <int>& myS) 
{ 

if (myS.size() == 2) 
{ 
    int num1, num2, answ; 
    num2 = myS.top(); 
    myS.pop(); 
    num1 = myS.top(); 
    myS.pop(); 
    if (e == '+') 
     answ = num1 + num2; 
    else if (e == '-') 
     answ = num1 - num2; 
    else if (e == '*') 
     answ = num1 * num2; 
    else if (e == '/') 
     answ = num1/num2; 
    else if (e == '%') 
     answ = num1 % num2; 
    else 
     cout << "\nError- Invalid operator" << endl; 

    cout << "\nCalculating..." << endl << answ << endl; 
    myS.push(answ); 
} 
else 
    cout << "\nInvalid stack size- too few, or too many" << endl; 
} 
+0

一度に1つ、どの声明が問題を引き起こしていたか? –

+0

'' cin''から '' std:string''オブジェクトにデータを読み込むとき、スペースは2つの値の間の分離として見られることに注意してください。 http://stackoverflow.com/questions/5838711/c-cin-with-with-spaces – BrainStone

+0

を参照してください。これによりスペースの問題が発生します.37 * 9 - 3 * 7は動作しますが、-9は動作しません。また、37 * n +と言ってみると、私に無効な表現を教えるのではなく、無効なサイズと言います。 –

答えて

0

です:

cin >> exp; 

文字列抽出は、スペースに敏感です。したがって、入力で空白文字が見つかるとすぐに、文字列の読み取りは停止し、空白はexpに含まれません。

あなたがスペースを含むフルラインを取得したい場合は、選ぶ必要がありますのために:

編集
getline (cin, exp); 

:あなたはgetline()で発生する問題は、あなたが求めるchar型の抽出にrealtedさ

ユーザーが電卓を使用したい場合。入力するyでは不十分です。だからyと入力してと入力します。 のみがansに入れられるので、getline()は空の行の読み取りを開始します。

これを解決するために、あなたの最初の入力更新:

cin >> ans;     // as before 
    cin.ignore (INT_MAX, '\n'); // add this to skip everything until newline included 
ここ

それは(間違ったオペレータの場合のエラーメッセージを含む)に動作していることを示すonline demo

デバッガを使用し、各ステートメントを実行
+0

このアプローチを試してみると、コンパイラはユーザーが式を入力できるように完全にスキップし、whileループチェックにまっすぐに進みます –

+0

構文解析している式を教えてください。 – Christophe

+0

getline(cin、exp)を使う式には入力できません。出力は次のようになります:式を入力してください:計算機を使用するかどうかをユーザに問い合わせます –