2

我必须构建一个 C 程序,使用 STACK 将中缀表示法转换为后缀表示法。进展顺利,并且在某种程度上发挥了作用。上次我使用 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 终止你的字符串!开玩笑。你有没有从其他三十多个告诉你的人那里得到这个信息?只是在此基础上添加一些信息,垃圾字符试图解释超出char[]as 字符末尾的内存中发生的任何内容。它会抓取内存中的所有内容,直到遇到空终止字符并将其全部吐出,并且每次都相同的原因是每次程序运行时您的char[]ĚĚĚĚĚĚĚĚĚĚĚ被分配到彼此旁边。如果您已经知道所有这些,那么我很抱歉用另一个多余的答案浪费您的时间。

于 2011-11-09T22:38:48.603 回答
3

您需要 NUL 终止postfix

postfix[p] = 0;
printf...

一种更简单(但效率稍低)的方法是将数组初始化{0}为.memset0

于 2011-11-09T21:53:39.713 回答
3
    char infix[20], postfix[20];

您不会初始化这些,也不会在算法末尾附加 '\0' 。

于 2011-11-09T21:54:57.603 回答
3

看起来您的字符串不是以空值结尾的。

于 2011-11-09T21:55:17.463 回答
3

正如其他人所说,您应该初始化您的数组。

或者,在程序中的任何时候,您都可以使用,

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

这会将数组元素的所有值设置为零。

于 2011-11-09T22:03:03.307 回答
0

我的猜测是您混淆了字符和指向字符串的指针。POP() 和 PUSH() 的定义在哪里?什么是 ndi_tip() 为什么不在 forloop 中使用 switch,这样更容易阅读和维护。

于 2011-11-09T21:58:44.257 回答