Буферизованная строка искажена - PullRequest
1 голос
/ 02 декабря 2011

Я делаю XML-форматтер на C. Это действительно хорошо, но мой предыдущий подход (прямой printf для каждого символа) не выводил бы правильное количество пробелов для каждой строки.Поэтому я создал строковый буфер и realloc редактировал его каждый раз для печати нового символа.(Я знаю, что это не самое лучшее, но мне все равно.) Новый код не будет очищать буфер или правильно определять новые строки.

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 Ответ

4 голосов
/ 02 декабря 2011

malloc(1) вызов не обнуляет только что выделенный байт.Вы должны сделать это самостоятельно, иначе ваша вновь выделенная память может содержать некоторый случайный ненулевой байт.

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

Если это не решит вашу проблему, то ошибка может находиться где-то еще, что вы нам не показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...