2011-11-09 43 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[]ĚĚĚĚĚĚĚĚĚĚĚ都會相互分配。如果你已經知道了所有這些,那麼我很抱歉浪費你的時間與另一個多餘的答案。