2016-11-07 19 views
-1

C++で型を変換する際に問題があります。私は式があります:string wholeExpression = "44*2";と私は演算子から数値を分離したいと思います。 それはオペレータである場合、私はこのコードの一部を使用します。文字列をcharに変換する

string subExpression; 
    char skladnik; 

subExpression = wholeExpression.substr(poczatek, lenght); 
      skladnik = subExpression[0]; 

それが数値の場合:

subExpression = wholeExpression.substr(poczatek, lenght); 
      skladnik = atoi(subExpression.c_str()); 

@EDIT

switch (skladnik) 
     { 


     case '+': 
     case '-': 
     { 

      while (topOfStack > 0 && stack[topOfStack - 1] != '(') 
      { 
       outPut += stack[topOfStack - 1] + przecinek; 
       stack.resize(topOfStack - 1); 
       topOfStack--; 
      } 
      stack += skladnik; 
      topOfStack++; 
      break; 
     } 

     case '/': 
     case '*': 
     { 
      while (topOfStack > 0 && (stack[topOfStack - 1] == '*' || stack[topOfStack - 1] == '/')) 
      { 
       outPut += stack[topOfStack - 1] + przecinek; 
       stack.resize(topOfStack - 1); 
       topOfStack--; 
      } 
      stack += skladnik; 
      topOfStack++; 
      break; 
     } 

     case '(': 
     { 
      stack += skladnik; 
      topOfStack++; 
      break; 
     } 
     case ')': 
     { 
      while (stack[topOfStack - 1] != '(') 
      { 
       outPut += stack[topOfStack - 1] + przecinek; 
       stack.resize(topOfStack - 1); 
       topOfStack--; 
      } 
      if (stack[topOfStack - 1] == '(') 
      { 
       stack.resize(topOfStack - 1); 
       topOfStack--; 
      } 
      break; 
     } 

     default: 
     { 
      outPut += to_string(skladnik) + przecinek; 
      break; 
     } 
     } 


    } 

しかし、突然、私は問題を持っています(ASCIIコードで)演算子である40から43と45と47 - の数字を持つ。それらはおそらく、スイッチではなく数値として解釈されますが、オパレータとして解釈されます。別の数字は完全に機能します。どうすればこの問題を解決できますか?

+0

これの代わりに実際の 'switch'を投稿できますか?擬似コードの代わりに実装を見る方がはるかに簡単です。 –

+0

私はあなたがそれがtlだと思うと思った。だから私はそれを短くしようとしたのです – Mikkey

+0

このような問題を解決する正しいツールはデバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

答えて

0

変数skladnikは、2通りの方法で使用しています。 1つのコードパスでは、デコードされた整数を参照し、2番目のコードパスでは文字を参照します。一度あなたがこのような意味を抱いてしまえば、それが意味するところのswitchにいったんいったんいればそれを伝える方法はありません。

デコードされた数値と演算子文字の2つの異なる変数を使用する必要があります。その後、にはの混乱があります。

1

あなた自身の質問に答えました。番号40のcharは存在しません。 2つのcharの変数:4と0です。intをatoiでcharに入れているので、ASCIIコードを使用します。 lenghtの値を知らなくても、それは、これは確かにあなたの問題であると言うのは難しいですが、ここでは2つの解決策です:

  1. atoi先行を使用しないでください。あなたのswitch文(4と0が atoi('4') * 10 + atoi('0')だろう)した後、代わりに自分の番号を保持するためにintまたはlongまたはdouble変数を使用
  2. 実際の整数にそれぞれ数charを解釈します。
関連する問題