0

中置式を逆表記に変換するコードを書いていますが、ファイルの実行時にプログラムがクラッシュします。

typedef struct stack
 {
   char a[400];
   int top;
 }
 stack;
 stack s;
 void push(char *,int);
 int pop();

 int main()
  {
    char x[400];
    int len,i,y;
    puts("Enter string");
    scanf("%s",x);
    len=strlen(x);
    for(i=0;i<len;i++)
      {
//considering user is entering only the small alphabets 

      if((x[i])>=97&&x[i]<=122)
      printf("%s",x[i]);

      else
//if encountering the operator then pushing it into stack

      if(x[i]=='/'||x[i]=='*'||x[i]=='+'||x[i]=='-')
        {
        push(x,i);
        }

      else if(x[i]=='(')
      continue;
//When encountering the ')' then popping the operator

      else
        {
        y=pop();
        printf("%c",y);
        }
    }

  return 0;
 }

配列とそのサイズを引数として渡す

void push(char *x,int i)
{
  stack s;
  s.top++;
  s.a[s.top]=x[i];
}

")" を見つけるとポップされた演算子を返す

int pop()
 {
   stack s;
   int temp;
   temp=s.a[s.top];
   s.top--;
   return temp;
 }
4

1 に答える 1

1

あなたのコードで

printf("%s",x[i]);

間違っている。あなたが欲しいのは

printf("%c",x[i]);

C11標準、章7.21.6.1%s書式指定子ごとの AS

長さ修飾子 l が存在しない場合、引数は文字型の配列の最初の要素へのポインタになります。...

しかし、ここx[i]にタイプがありcharます。

また、パラグラフ9から、

対応する変換仕様に対して正しい型でない引数がある場合、動作は未定義です。

したがって、コードは未定義の動作を呼び出します。

次に、関数 と の両方についてpush()pop()ローカル変数 を定義していますstack s。これらの関数を呼び出すたびに作成され、実行が終了すると破棄されます。代わりに gloabl 変数を使用することもできます。ローカル変数を削除します。それらは必要ありません。

また、両方の関数で、配列s.topのインデックスとして値を使用していますが、同じ境界チェックはありません。値をインデックスとして使用する前に、スタックがフルの場合 ( ) およびスタックが空の場合 ( )s.aの配列インデックス値をチェックする必要があります。の増分と減分もチェックの下に配置する必要があります。push()pop()s.tops.top


編集:

論理部分については、すべての入力を解析した後、ポップする要素がスタックに残っているかどうかを確認する必要があります。完全な表記を取得するには、スタックが空になるまでスタックの内容を出力する必要があります。疑似コードのアイデアについては、以下の私のコメントを確認してください。


注:C標準に従ってint main()int main(void)

于 2015-03-24T10:23:02.407 に答える