2016-07-22 3 views
0

누군가 myString에서 strok()를 사용한 후에 왜 계속 헛소리가 날 수 있는지 설명해 주시겠습니까? 내 출력 사진이 맨 아래에 있습니다. 나는 NULL 문자로 mystring에있는 모든 단일 요소를 초기화 시도하지만 여전히 내 코드 나던 일 :(RPN 계산기 C

예상 출력 :

enter image description here

내 출력 :

enter image description here

int main() 
{ 
    int i; 
    char myString[60]; 
    char *token; 
    float result; 
    float x; 
    float y; 
    struct Stack myStack; 
    StackInit(&myStack); 


    BOARD_Init(); 

    printf("\nWelcome to my RPN calculator.\n"); 
    printf("Enter floats and + -/* in RPN format: \n >"); 

    for (i = 0; i < sizeof (myString); i++) { 
     myString[i] = '\0'; 
    } 

    fgets(myString, sizeof (myString), stdin); 



    token = strtok(myString, " "); 
    while (token != NULL) { 
     printf("%f\n", atof(token)); 
     token = strtok(NULL, " "); 

     if (atof(token) != 0) { 
      StackPush(&myStack, atof(token)); 
     } else if (*token == '+') { // if token is addition 
      StackPop(&myStack, &y); 
      StackPop(&myStack, &x); 
      result = x + y; 
      StackPush(&myStack, result); 

     } else if (*token == '-') { // if token is subtraction 
      StackPop(&myStack, &y); 
      StackPop(&myStack, &x); 
      result = x - y; 
      StackPush(&myStack, result); 
     } else if (*token == '*') { // if token is multiplication 
      StackPop(&myStack, &y); 
      StackPop(&myStack, &x); 
      result = x * y; 
      StackPush(&myStack, result); 
     } else if (*token == '/') { // if token is division 
      StackPop(&myStack, &y); 
      StackPop(&myStack, &x); 
      result = x/y; 
      StackPush(&myStack, result); 
     } 

    } 




while (1); 

}

+1

을하지 마십시오 텍스트 출력 이미지를 게시하십시오. 질문 자체 내에 텍스트로 붙여 넣으십시오. 이를 통해 다른 사람들이 코멘트/질문에서 참조하기 쉽게 복사 할 수 있습니다. – kaylum

+2

또한 [mcve]를 게시하십시오. 우리가 볼 수없는 코드에 대해서는 언급 할 수 없습니다. 완전한 코드는 또한 우리가 그것을 실행하고 스스로 프로그램을보고/디버그 할 수있게합니다. – kaylum

+2

'while (token! = NULL) { printf ("% f \ n", atof (토큰)); token = strtok (NULL, "");': 첫 번째 토큰이 삭제됩니다. – BLUEPIXY

답변

0
token = strtok(myString, " "); // Here you get the first sub string 
while (token != NULL) { 
    printf("%f\n", atof(token)); 
    token = strtok(NULL, " "); // Here you get the second sub string 
           // and throw away the first substring 
           // So all the code below is never executed 
           // for the first substring. 
           // In other words: You never push the first 
           // float to the stack 

    if (atof(token) != 0) { 
     StackPush(&myStack, atof(token)); 

당신이 대신 할 일은 루프의 끝 token = strtok(NULL, " ");를 이동하는 것입니다 :으로는 코드가 여기에 문제가 댓글에 @BLUEPIXY 지적

while (token != NULL) { 
    printf("%f\n", atof(token)); 
    // Not here............. token = strtok(NULL, " "); 

    if (atof(token) != 0) { 
     StackPush(&myStack, atof(token)); 
    } else if (*token == '+') { // if token is addition 
    //... 
    //... 
    } 

    token = strtok(NULL, " "); // but here 
} 
+0

나는 printf ("% f", myStack)를 추가했다; 전에 토큰 = strtok (NULL, ""); 내 결과가 세 번 나오면 왜 그런지 알겠습니까? –

+0

@ JohnSnow -'printf ("% f", myStack);'? 그게 큰 경고 야! '% f'를 사용하여'struct '를 출력 할 수 없습니다 - 이것은 float과 double에서만 가능합니다. 항상 모든 경고를 켜야합니다. 'gcc'의 경우 항상'gcc -Wall ... '을 사용하십시오. – 4386427

+0

오류가 발생하지만 어떻게하면 스택에 마지막으로 인쇄 할 수 있습니까? 나는 결과를 반환하겠습니까? ? –