2016-07-22 12 views
0

Kann mir bitte jemand erklären warum ich immer wieder Kauderwelsch bekomme nachdem ich strok() auf myString benutzt habe? Ein Bild meiner Produktion ist unten. Ich habe versucht, jedes einzelne Element in myString Initialisierung ein NULL-Zeichen zu sein, aber mein Code immer noch nicht funktioniert :(RPN Rechner in C

Erwartete Ausgabe:

enter image description here

Meine Leistung:

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

Bitte nicht Post Bilder der Textausgabe. Fügen Sie es als Text in die Frage selbst ein. Dies ermöglicht es anderen, es leichter als Referenz in Kommentaren/Fragen zu kopieren. – kaylum

+2

Bitte posten Sie auch eine [mcve]. Wir können keinen Code kommentieren, den wir nicht sehen können. Vollständiger Code erlaubt uns auch, es auszuführen und das Programm für uns selbst zu sehen/zu debuggen. – kaylum

+2

'while (Token! = NULL) { printf ("% f \ n ", atof (Token)); token = strtok (NULL, ""); ': Das erste Token wird verworfen. – BLUEPIXY

Antwort

0

Wie bereits in einem Kommentar von @BLUEPIXY aus, Ihr Code hat ein Problem hier:

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

Was sollten Sie stattdessen zu tun ist token = strtok(NULL, " "); bis zum Ende der Schleife zu bewegen:

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

Ich fügte ein printf hinzu ("% f", myStack); vor dem Token = strtok (NULL, ""); und mein Ergebnis ist das dreimalige Ausdrucken. Würdest du zufällig wissen warum? –

+0

@JohnSnow - 'printf ("% f ", meinStack);'? Das sollte dir eine große Warnung sein! Sie können eine 'struct' nicht mit'% f' drucken - das ist nur für Floats und Doubles. Sie sollten immer alle Warnungen aktivieren. Für 'gcc' verwende immer' gcc -Wall ... ' – 4386427

+0

es gibt mir einen Fehler, aber wie würde ich nur das letzte Ding auf meinem Stapel ausdrucken? Würde ich nur Ergebnis zurückgeben; ? –