2011-11-09 62 views
2

我不得不建立一个C程序,它使用STACK将中缀表示法转换为后缀表示法。这进展顺利,并以某种方式工作。很久以前,当我使用上次的C语言时,我可能不会很好地使用char []变量。C langugage - char []输出中的“奇怪”字符

所以问题是,当我给这样的输入:

A+B*(C*E-D) 

我的程序返回此:

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

所以你看我的节目做后缀的转换非常好,但我有一堆“垃圾”字符在我的结果(ĚĚĚĚĚĚĚĚĚĚĚ)。

这里是我的代码(只有我认为是不正确的,或许真的用的char []和方式如何我assing值与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; 

} 

缀[]是我的输入后缀[]是我的输出。我做了什么错了,我为什么我在ĚĚĚĚĚĚĚĚĚĚĚ字符。谢谢你在前进!

+1

感觉你在转换的字符串中缺少空终止符? –

+0

谢谢大家!如果我能,我会标记你的答案是正确的!初学者我的错误:)我忘了做一些基本的事情:) – rjovic

回答

4

看起来您的postfix字符串中没有NUL终止符。你既可以在算法结束的定义修改为char postfix[20] = {0};,或者你只是在printf之前,您可以添加postfix[p] = '\0';

3

您需要NUL,终止postfix

postfix[p] = 0; 
printf... 

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

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

你不初始化这些,也没有追加“\ 0”。

3

它看起来不像你的字符串是null终止。

0

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

3

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

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

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

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

3

你不会终止你的字符串!开玩笑。你是否从三十多位告诉你的人那里得到了这个信息?只要在其上添加一些信息,垃圾字符就是试图解释在内存中发生的任何内容,而不是以字符结尾。它抓住内存中的所有内容,直到它遇到一个空终止字符并将其全部吐出,并且每次都一样的原因是,每次程序运行时,您的char[]ĚĚĚĚĚĚĚĚĚĚĚ都会相互分配。如果你已经知道了所有这些,那么我很抱歉浪费你的时间与另一个多余的答案。