2011-11-09 7 views
2

STACKを使って後置記号に変換するCプログラムをビルドする必要がありました。それはうまくいって、それは何らかの形で働いています。私は前回のC言語を使っていたので、char []変数はあまりうまく使用していませんでした。C langugage - char []出力の "奇妙な"文字

だから、問題は、私はこのような入力を与えるときということです:あなたは私のプログラムは非常によくpostfixの変換をした見たが、私はの束を持っているように

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

A+B*(C*E-D) 

私のプログラムはこれを返します私の結果で "ガーベジ"の文字が表示されます。

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; 

} 

中置[]は私です:ここで

は私が[]多分、文字で何か正しくないと私は[]変数を後置する値をASSING方法どのように考えて自分のコードのスニペット(一部のみですあなたはNUL-終了postfixに必要な入力とpostfixの[]私の出力である。私は、なぜ私はĚĚĚĚĚĚĚĚĚĚĚ文字を持っています間違って何をしました。事前にありがとうございます!

+1

変換された文字列にヌルターミネーターがないような気がしますか? –

+0

ありがとうございました!もし私が答えることができれば、すべての答えを正しいものとしてマークします。私の初心者のミス:)私はいくつかの基本的なことをするのを忘れて:) – rjovic

答えて

4

postfix文字列にNULターミネーターがないようです。アルゴリズムの最後に「\ 0」あなたはchar postfix[20] = {0};に定義を変えることができるのいずれか、またはあなただけprintf前に、あなたはpostfix[p] = '\0';

3

postfix[p] = 0; 
printf... 

より簡単な(ただし、やや効率の低い)方法は、配列を{0}に、またはmemset0に初期化することです。

3
char infix[20], postfix[20]; 

あなたはこれらを初期化し、また追加されません追加することができます。

3

あなたの文字列がnullで終わるように見えません。

0

私は文字と文字列へのポインタが混乱していると思います。 POP()とPUSH()の定義はどこですか? ndi_tip()とは何ですか? forループ内でスイッチを使用しないと、読みやすく保守がはるかに簡単です。

3

他の人からはあなたの配列を初期化する必要があると言われています。ゼロに配列要素のすべての値を設定します

または、プログラム中の任意の時点で、あなたが使用することができ、

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

3

あなたはあなたのストリングを終わらせませんでした!キッド。あなたに言った30人ほどの人からまだそのメッセージを受け取ったのですか?その上にいくつかの情報を追加するだけで、ガベージ文字は、char[]の末尾を超えてメモリにあるものが文字として解釈される試みです。それはメモリ内にあるすべてのものを取り込み、ヌル終了文字に当たってそれを吐き出し、毎回同じ理由は、あなたのchar[]ĚĚĚĚĚĚĚĚĚĚĚがプログラムが実行されるたびにお互いに割り当てられるということです。あなたがすでにこのことをすべて知っていたら、別の余計な答えであなたの時間を無駄にすることをお詫びします。