2010-12-05 8 views
0

Я пытаюсь читать из сокета и печатать на stdout с помощью printf (a must);printf of char * получает ошибку сегментации

Однако я получаю ошибку сегментации каждый раз, когда я читаю конкретный файл (HTML) с разумного веб-сайта.

Пожалуйста, взгляните на этот код и скажите мне, что случилось.

int total_read = 0; 
char* read_buff = malloc(BUF_SIZE); 
char* response_data = NULL; 
if (read_buff == NULL){ 
    perror("malloc"); 
    exit(1); 
} 
while((nbytes = read(fd, read_buff, BUF_SIZE)) > 0){ 
    int former_total = total_read; 
    total_read += nbytes; 
    response_data = realloc(response_data, total_read); 
    memmove(response_data + former_total, read_buff, nbytes); //start writing at the end of spot before the increase. 
} 
if (nbytes < 0){ 
    perror("read"); 
    exit(1); 
} 

printf(response_data); 

Thank you.

+1

Вы должны нажать на значок галочки-форме ответов, которые решают вашу проблему. – erjiang 2010-12-05 20:55:19

+1

Что может быть в response_data? Если он содержит символы форматирования printf, printf попытается получить доступ к некоторым параметрам, которые вы не передали. Попробуйте вместо этого ставить? – 2010-12-05 20:55:55

ответ

9

response_data, вероятно, не завершен, но printf не завершен. Или, возможно, он содержит директиву %, но printf не может найти дальнейших аргументов.

Вместо этого скажите printf, как далеко читать, и не интерпретировать любые % директивы в строке.

printf("%.*s", total_read, response_data); 

Обратите внимание, что если response_data содержит встроенный NUL, printf будет останавливаться, даже если total_read больше.

+1

Одна коррекция: printf ("%. * S", total_read, response_data); (а не перед звездочкой). – 2010-12-06 01:04:42

+0

@ Luis: имеет значение только если `response_data` имеет встроенный NUL, где`% * s` прокладывает пробелы, `% - * s` прокладки с пробелами на другой стороне, а`%. * S` не заполняет все. Зависит от того, что хочет OP ... – ephemient 2010-12-06 01:11:08

1

Что может быть в response_data? Если он содержит символы форматирования printf (т. Е. %, за которым следует один из обычных вариантов), printf попытается получить доступ к некоторым параметрам, которые вы не прошли, и вероятность сегментации весьма вероятна. Попробуйте вместо этого puts?

Если вы должны использовать Printf, сделать printf("%s", response_data) (и NUL-прекратить его первый)

-2

Мое понимание со стороны ваше сообщение о том, что ответ на данные HTML.
И поскольку это текст, который вы пытаетесь распечатать. Не используйте printf так, как вы.
Вместо сделать следующее:

for(int i = 0; i < total_read; i++) 
    putc(response_data[i],stdout); 
Смежные вопросы