C语言 - char []输出中的“奇怪”字符

时间:2011-11-09 21:51:15

标签: c char character chars

我必须构建一个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 []是我的输出。我做错了什么我为什么我有ĚĚĚĚĚĚĚĚĚĚĚ角色。提前谢谢!

7 个答案:

答案 0 :(得分:4)

看起来你的postfix字符串上没有NULL终止符。您可以将定义更改为char postfix[20] = {0};,或者就在printf之前,您可以添加postfix[p] = '\0';

答案 1 :(得分:3)

您需要NUL终止postfix

postfix[p] = 0;
printf...

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

答案 2 :(得分:3)

    char infix[20], postfix[20];

您不会初始化这些,也不会在算法结束时追加'\ 0'。

答案 3 :(得分:3)

看起来您的字符串无法终止。

答案 4 :(得分:3)

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

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

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

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

答案 5 :(得分:3)

你已经DIDN&T; T NULL终止你的字符串!开玩笑。你是否从那些告诉你的三十多个人那里得到了这个消息?只是为了在其上添加一些信息,垃圾字符试图解释在char[]结束之后发生在内存中的任何事情。它抓住了内存中的所有内容,直到它遇到一个空终止字符并将其全部吐出,并且每次都是相同的原因是你的char[]ĚĚĚĚĚĚĚĚĚĚĚ得到了每次程序运行时彼此相邻分配。如果你已经知道所有这些,那么我为另一个多余的答案浪费你的时间而道歉。

答案 6 :(得分:0)

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