2016-12-20 7 views
0

私のプログラムは基本的には中置式を後置式に変換しますが、これまでのところ私のプログラムは1桁の数字しか受け付けませんでした。とにかく、私の中置式を入力した直後にコンパイルしようとすると、プログラムはすぐにクラッシュします。私のコード:文字列入力後にプログラムがクラッシュする

#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--]; 
} 

私が働いていたが、私は、このバージョンを見たとき、何が何が違うように思わないこののバージョンを持っていました。誰かが私に行方不明を教えてもらえますか?

+2

あなたの最初のループ( 'init'を介して)にはかなり悪い(私は思うが)論理エラーが含まれていて、無意識のうちに文字列ターミネーターを使用することができます。代わりに 'for'ループに変更してみてください。 –

+0

また、 'result'にポップアップする2番目のループも欠陥があり、スタックで使われていない' stack [0] 'を使います。スタックについて言えば、スタックオーバーフローチェックはありません。 –

答えて

1

私が見つけた主な問題は次のとおりです。

while (init[x++] != '\0') あなたがループの条件チェックでxの値をインクリメントしながら、あなたは再び関数の呼び出しでそれにアクセスしよう:

isalnum(init[x])

最初の数値は決してこのように評価されません。したがって、「5 + 2」と入力すると、無効な中置式である「+2」だけが評価されます。

+0

このプログラムの私の最後のバージョンは確かに同じ方法で実行され、評価されました。ここでは私のプログラムは文字列の入力を逃し、新しい文字列を作成してそれを印刷することを拒否します。私はしばらくの間C言語を学んできましたが、このすべてがまだ私を混乱させるので、この問題に対する適切な解決策があれば助けになります。 –

+0

その場合は、以前のバージョンも@AmirulUmarに投稿する必要があります – Amita

関連する問題