2016-11-07 1 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

대신 실제 '스위치'를 게시 할 수 있습니까? 의사 코드 대신 구현을 보는 것이 훨씬 쉬울 것입니다. –

+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입니다. int을 atoi를 사용하여 char에 넣으므로 ASCII 코드를 사용하게됩니다. lenght의 가치를 모른 채,이 참 문제라고 말할 힘들지만, 여기에 두 가지 가능한 해결 방법은 다음과 같습니다 :

  1. 가 선행 atoi를 사용하지 마세요. 대신 스위치 문 뒤에 실제 정수로 각 숫자 char 해석 (4, 0 atoi('4') * 10 + atoi('0') 것)
  2. 이 번호를 유지하기 위해 int 또는 long 또는 double 변수를 사용합니다.
관련 문제