2016-07-22 44 views
0

誰かがmyStringでstrok()を使用した後、どうしてぎこちなくなっていくのか説明してください。私の出力の写真が一番下にあります。私は、NULL文字としてのmyStringにすべての単一の要素を初期化しようとしたが、それでも私のコードdoesntの仕事:(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)); token = strtok(NULL、 ""); ':最初のトークンは破棄されます。 – BLUEPIXY

答えて

0

としてはコメントで@BLUEPIXYが指摘し、あなたのコードは、ここで問題があります:あなたの代わりに何をすべき

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, " ");を移動することです:

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、 "");私の結果は3回印刷されています、なぜあなたは知っていますか? –

+0

@ JohnSnow - 'printf("%f "、myStack);'?それはあなたに大きな警告を与えるはずです! '%f'を使って' struct 'を出力することはできません。これはfloatとdoubleだけです。常にすべての警告をオンにする必要があります。 'gcc'では常に' gcc -Wall ... 'を使います。 – 4386427

+0

エラーが出ますが、スタックの最後のものだけをプリントアウトする方法はありますか?私はちょうど結果を返しますか? ? –