2011-12-02 92 views
1

我在C中製作一個XML格式化程序。它非常好,但是我以前的方法(在每個字符處直接輸入printf)不會爲每行打印適當的空間量。因此,我做了一個字符串緩衝區,並且每次都打印一個新字符。 (我知道這不是最好的,但我不在乎。)新代碼不會清除緩衝區或正確檢測換行符。緩衝的字符串損壞

void bufprint(char **line, char *poo) { 
    /*SNIP old code without realloc*/ 
    *line=realloc(*line,strlen(*(line))+1+strlen(poo)); 
    strcpy(*line+strlen(*line),poo); 
} 

並且buf被聲明爲char *buf=malloc(1);。 bufprint被稱爲:bufprint(&buf,"<");

代碼清除緩存:

if (new) { 
     new=False; 
     int i; 
     for (i=0; i < level; i++) { 
      printf(" "); 
     } 
     printf("%s",buf); 
     free(buf); 
     buf=malloc(1); 
     printf("\n"); 
     //printf("BUFFER CLEARED! --------------"); 
     //printf("New buffer: %s %d",buf,strlen(buf)); 
    } 

輸出示例:

< 
<root> 
    <root><element num="1"> 
    This is element 1 

</element> 
    </element><element num="2"> 
    This is element 2 

    <subelement> 
    <subelement>This is a sub-element 

    </subelement> 
    </subelement>Self-closing tag: 

    <br /> 
<br /></element> 
</root> 
+1

您是否曾在執行buf = malloc(...)後將buf [0]初始化爲'\ 0'?如果不是,strlen(buf)可能會崩潰或返回一個長度,大於分配給buf的內存。 –

+0

我正確地閱讀你的問題 - 你期待免費/ malloc來「清除」一個緩衝區?如果是這樣,恐怕這在C中不起作用; malloc'd mem需要初始化。 – belwood

回答

4

malloc(1)通話將零出剛分配的字節。你必須自己做,否則你新分配的內存可能包含一些隨機的非零字節。

buf = malloc(1); 
buf[0] = '\0'; 

如果這樣不能解決您的問題,那麼這個錯誤可能會出現在您未向我們顯示的其他地方。

+0

在你做之前,我確實發現了這一點;我太懶惰了。不管怎麼說,還是要謝謝你! – Bob