2016-11-07 354 views
-1

我遇到了在C++中轉換類型的問題。我有一個表達式:string wholeExpression = "44*2";,我想從運營商中分離出數字。 如果它是一個經營者,我用這部分代碼:將字符串轉換爲字符

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; 
     } 
     } 


    } 

但是突然我有問題與數字從40到43和45和47 - >這是運營商(在ASCII碼)。他們可能不會將數字轉換爲數字,而是作爲oparators。另一個數字完美工作。我怎麼解決這個問題?

+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。在一個代碼路徑中,它指的是一個解碼的整數,在第二個代碼路徑中它指的是一個字符。一旦你把這樣的意思混爲一談,一旦你在switch這意味着它有,就沒有辦法告訴。

您應該使用兩個不同的變量,一個用於解碼數字,另一個用於操作員字符。那麼會出現沒有混淆。

1

您已回答了您自己的問題。數字40的char不存在。這是兩個char變量:4和0.因爲您將使用atoi將int放入char,它將使用ASCII碼。如果不知道的lenght價值,很難說,這確實是你的問題,但這裏有兩個可能的解決方案:

  1. 不要使用atoi前期。相反,解釋每個數字char成實際的整數您的switch語句後(4和0將 atoi('4') * 10 + atoi('0')
  2. 使用intlongdouble變量來保存你的號碼。