0

この「電卓」タイプのプログラムを動作させるのにとても楽しい時間を過ごしています。

後置記法に変換される算術式を入力します。(大したことではありません、私は昨年それを機能させました)

しかし、私はいまいましい後置記法を評価することはできません!メインの最初のwhileループをチェックアウトすると、セグメンテーション違反が発生することがわかります。

誰かが何か考えを持っているなら、私はいくつかのポインタをいただければ幸いです(笑)。

ありがとう

4

3 に答える 3

0
int j;

while((ch=postnot[j]) !='\0')

を初期化していないjため、-20 億から 20 億の間の値になる可能性があります。さらに、正しいスコープで j をインクリメントしていないため、コードが機能するとは思いません。

于 2013-03-13T04:03:46.827 に答える
0

コードのエラーにフラグを付けるために「**」を使用しないでください。サンプルコードで読者の注意を喚起したい場合は、コメントを使用してください。

マイナーですが、isdigit() のヘッダー ctype.h がありません。これらのことを診断するのに役立つように、コンパイラの警告レベルを上げてください。

このようにインクリメントしようとしないでください。これj=j++; は未定義の動作です。j++;代わりに使用してください。

gets() は絶対に使用しないでください。これは昔の遺物であり、新しいコードでは使用しないでください。そのためのmanページから:

gets() 関数は安全に使用できません。境界チェックがなく、呼び出しプログラムが次の着信行の長さを確実に判断できないため、この関数を使用すると、悪意のあるユーザーが実行中のプログラムの機能をバッファ オーバーフロー攻撃によって任意に変更できるようになります。すべての場合に fgets() 関数を使用することを強くお勧めします。

スタック データ構造での試みが何をするのか、特にプッシュ/ポップを呼び出す前の初期化を注意深く調べる必要があると思います。境界チェックを行い、いっぱいになったスタックへの push()、空のスタックからの pop()、最初の使用のためのスタックの初期化などをチェックするのはあなたの責任です。あなたのコードはそれらの問題を無視します。

他にもありますが、アスタリスクをドロップして例を壊した場所につまずき続けています。

明らかなコンパイルの警告/エラーの結果を最初に修正するだけで、この質問を回避できた、または少なくとも自分でさらに進んだ可能性があると感じずにはいられません。

于 2013-03-13T04:03:55.783 に答える
0

コードに多くのエラーが含まれています。

  • topとして定義されており、印刷の-1ためにアクセスしていますstack[top]

  • 文字列ではなく特定のインデックスで文字を出力する場合%cは、printf代わりにを使用する必要があります%s

  • jループ内で変数を変更していません。また、ループに入る前にwhileintilaizing していません。j

私はあなたの間違いのいくつかを修正しました。これを試してください

  printf("\nPostfix Notation = %s\n",postnot);
  int j = 0;

 while((ch=postnot[j]) !='\0'){     //THIS IS WHERE I GET SEGMENTATION FAULT 
                           //CORE DUMPED WHILE DEBUGGING
    if(isdigit(ch))
    {
       push(ch - '0');
    }
   else
    {   op2=pop();
        op1=pop();
      switch(ch)
        {
            case '+':push(op1+op2);break;
            case '-':push(op1-op2);break;
            case '*':push(op1*op2);break;
            case '/':push(op1/op2);break;
        }
    }
    j++;
  }
  printf("\nANSWER= %d\n",pop());
于 2013-03-13T04:04:13.790 に答える