2

STACK を使用して中置記法を後置記法に変換する C プログラムを作成する必要がありました。それはうまくいき、何らかの形で機能しています。前回 C 言語を使ったのはかなり前のことなので、おそらく char[] 変数をあまりうまく使っていないのでしょう。

だから問題は、私がこのような入力を与えるときです:

A+B*(C*E-D)

私のプログラムはこれを返します:

ABCE*D-*+ĚĚĚĚĚĚĚĚĚĚĚ

ご覧のとおり、私のプログラムは後置変換を非常にうまく実行しましたが、結果に「ガベージ」文字がたくさんあります (ĚĚĚĚĚĚĚĚĚĚĚĚ)。

これが私のコードのスニペットです(私が正しくないと思う部分のみ、おそらくchar []を使用したものと、postfix []変数に値を代入する方法:

int main()
{
    char infix[20], postfix[20];
    int len, tip, i, p=0;

    STACK pom;
    MAKE_NULL(&pom);

    printf ("Unesi izraz.\n");
    scanf ("%s", infix);

    len = strlen(infix);

    for(i=0; i<len; i++)
    {
        tip = nadi_tip(infix[i]);

        if (tip == Lijeva)
        {
            PUSH (infix[i], &pom);
        }

        if (tip == Operand)
        {
            postfix[p] = infix[i];
            p++;
        }

        if (tip == Desna)
        {
            while (!EMPTY(pom) && (TOP(pom)!= '('))
              {
                postfix[p++] = TOP(pom);
                POP (&pom);
              }
            POP (&pom);
        }

        if (tip == Operator)
        {
            while (!EMPTY(pom) && TOP(pom)!= '(')
             {
                if(prioritet(infix[i]) <= prioritet(TOP(pom)))
                {
                  postfix[p++] = TOP(pom);
                  POP (&pom);
                }
                else break;
             }
             PUSH(infix[i], &pom);
        }
    }
 while (EMPTY(pom) != 1)
 {
    postfix[p++] = TOP(pom);
    POP(&pom);
 }

 printf("Izlaz: %s", postfix);
 return 0;

}

infix[] は私の入力で、postfix[] は私の出力です。私は何を間違えたのですか?前もって感謝します!

4

7 に答える 7

4

postfix文字列に NUL ターミネータがないようです。定義をchar postfix[20] = {0};に変更するか、 の直前にprintf追加することができますpostfix[p] = '\0';

于 2011-11-09T21:54:27.503 に答える
4

文字列を NULL で終了しませんでした! 冗談です。そのメッセージをあなたに伝えた他の30人ほどの人々からまだ受け取っていますか? その上にいくつかの情報を追加するだけで、ガベージ文字は、あなたの最後を超えてメモリ内にあるものを文字として解釈しようとする試みchar[]です。ヌル終了文字にヒットしてすべて吐き出すまで、メモリ内にあるものをすべて取得します。毎回同じである理由は、プログラムが実行されるたびにchar[]ĚĚĚĚĚĚĚĚĚĚĚが隣り合って割り当てられるためです。すでにこれらすべてを知っている場合は、別の余分な回答で時間を無駄にしてしまったことをお詫びします.

于 2011-11-09T22:38:48.603 に答える
3
    char infix[20], postfix[20];

これらを初期化したり、アルゴリズムの最後に「\0」を追加したりしないでください。

于 2011-11-09T21:54:57.603 に答える
3

文字列がnullで終了しているようには見えません。

于 2011-11-09T21:55:17.463 に答える
3

他の人が言ったように、配列を初期化する必要があります。

または、プログラムのいつでも、次を使用できます。

memset (infix ,0, 20);
memset (postfix, 0, 20);

これにより、配列要素のすべての値がゼロに設定されます。

于 2011-11-09T22:03:03.307 に答える
3

NUL ターミネートする必要がありますpostfix

postfix[p] = 0;
printf...

より単純な (ただし効率はやや劣る) 方法は、配列を に初期化する{0}か、配列を に初期化するmemsetこと0です。

于 2011-11-09T21:53:39.713 に答える
0

私の推測では、文字と文字列へのポインターを混同していると思います。POP() と PUSH() の定義はどこにありますか? ndi_tip() とは forloop 内でスイッチを使用しないのはなぜですか。これにより、読み取りと保守がはるかに簡単になります。

于 2011-11-09T21:58:44.257 に答える