2011-12-02 93 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