2016-12-20 6 views
0

Mein Programm konvertiert im Grunde einen Infix-Ausdruck in einen Postfix-Ausdruck, obwohl mein Programm bisher nur einzelne Ziffern akzeptiert. Jedenfalls stürzt das Programm sofort nach der Eingabe meines Infix-Ausdrucks ab, wenn ich versuche zu kompilieren. Mein Code:Programm stürzt nach String-Eingang ab

#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 
#include <stdlib.h> 
int priority(char x); // Determines priority of incoming operator. 
void push(char x); // Pushes element to stack. 
char pop(); // Pops element from stack. 

char stack[10]; 
int top = -1; 

int main() { 
char init[20]; 
printf("Enter an expression: "); 
fgets(init, 20, stdin); 
int x = 0, y, z = 0; 
static char result[20]; 
while (init[x++] != '\0') { 
    if (isalnum(init[x])) 
     result[z++] = init[x]; // Operand printed out immediately. 
    else if (init[x] == '(') 
     push(init[x]); // '(' character pushed. 
    else if (init[x] == ')') { 
     while ((y = pop()) != '(')// Popping elements from stack until reaching '(' 
      result[z++] = y; 
    } else if (init[x] == ' ') { 
     z++; 
    else { 
     while (priority(init[x]) <= priority(stack[top])) // If expression operator has higher precedence than stack operator, expression operator is pushed onto stack. Else stack operator is popped and printed out. 
      result[z++] = pop(); 
     push(init[x]); 
    } 
} 
while (top != -1) 
    result[z++] = pop(); // Remaining operators printed out. 
printf("Final expression is %s.\n", result); 
} 
int priority(char x) { 
    int precedence = 0; 
    if(x == '(') 
     precedence = 0; 
    if(x == '+' || x == '-') 
     precedence = 1; 
    if(x == '*' || x == '/') 
     precedence = 2; 
    if(x == '^') 
     precedence = 3; 
    return precedence; 
} 

void push(char x) { 
stack[++top] = x; 
} 

char pop() { 
return stack[top--]; 
} 

hatte ich eine Version davon, die funktioniert, aber wenn ich bei dieser Version sehen, nichts scheint anders zu sein. Kann mir bitte jemand sagen, was ich vermisse?

+2

Ihre erste Schleife (über 'init') enthält einen ziemlich schlechten (ich denke) logischen Fehler, und Sie können den String-Terminator unwissentlich verwenden. Versuchen Sie es stattdessen in eine "for" -Schleife zu ändern. –

+0

Auch Ihre zweite Schleife, in die Sie 'result' eingeben, ist ebenfalls fehlerhaft und verwendet den' stack [0] ', den Ihr Stack nicht verwendet. Und wenn man über den Stack spricht, gibt es keinen Stack-Overflow-Check. –

Antwort

1

Ein wichtiges Thema, das ich gefunden ist:

while (init[x++] != '\0') Während Sie den Wert von x in der Zustandsüberprüfung der Schleife erhöhen, Sie wieder versuchen, es zu Funktion in Call zuzugreifen:

isalnum(init[x])

die erste Nummer wird nie auf diese Weise ausgewertet. Wenn Sie also "5 + 2" eingeben, wird nur "+2" ausgewertet, was ein ungültiger Infix-Ausdruck ist.

+0

Meine letzte Version dieses Programms wurde auf die gleiche Art und Weise durchgeführt und es konnte ausgewertet werden. Nur hier weigert sich mein Programm, über den String-Eingang zu gehen und einen neuen String zu erzeugen, der dann ausgedruckt wird. Ich habe C eine Weile gelernt und das alles verwirrt mich immer noch, also würde es helfen, wenn es eine richtige Lösung für dieses Problem gäbe. –

+0

Wenn das der Fall ist, sollten Sie Ihre vorherige Version auch @AmirulUmar veröffentlichen – Amita