2014-10-15 3 views
0

Я написал этот код (просто). Но для этого нужно два исправления.C - string, va_list

size_t send_header(int fd, int seconds, const char* header1, ...) { 
    char *buffer; 
    int count = 0; 
    const char * format = "%s"; 
    const char *hdr = header1; 
    va_list vl, vl_count; 
    va_start(vl, header1); 

    va_copy(vl_count, vl); 
    while (hdr != NULL) { 
     hdr=va_arg(vl_count,const char*); 
     ++count; 
    } 
    va_end(vl_count); 
    /* allocate storage for format string: */ 
    buffer = (char*) malloc(strlen(format) * count + 1); 
    buffer[0] = '\0'; 
    /* generate format string: */ 
    for (; count > 0; --count) { 
     strcat(buffer, format); 
    } 
    /* print integers: */ 
    printf(format, header1); 
    vprintf(buffer, vl); 
    va_end(vl); 
    if (BUFSIZ == 0) { 
     _myfunc_errorcode(ERROR); 
     return ERROR; 
    } 
    write(fd,buffer, strlen(buffer)); 
    _myfunc_errorcode(SUCCESS); 
    return SUCCESS; 
} 

1 FIX) этот код печати, в первый раз, на консоли это

HTTP/1.0 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: Thu, 01 Dec 1994 16:00:00 GMT 
Connection: close 
Content-Type: text/html;charset=utf-8 

второй раз печать на консоли это

(null)HTTP/1.0 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: Thu, 01 Dec 1994 16:00:00 GMT 
Connection: close 
Content-Type: text/html;charset=utf-8 

где добавить (нуль), я не очень хорошо знаю.

2 FIX) fd, в write(), является файловым дескриптором, который он использует в другой функции, но мой браузер показывает мне только% s% s% s, почему?

С уважением,

+0

Что такое if (BUFSIZ == 0) {? он не определен в коде. Почему ваш компилятор не заметил этого? – user3629249

+0

относительно этой строки (и следующей строки) _myfunc_errorcode (ERROR); 1 (вы никогда не должны (это немного сильно сформулировано) создавать функции, имя которых начинается с нижнего кода. 2 (ERROR не определен в коде. Почему ваш компилятор не отметил это? – user3629249

+0

относительно этой строки: buffer = (char *) malloc (strlen (format) * count + 1), вы всегда должны проверять результаты malloc(), чтобы убедиться, что операция прошла успешно, прежде чем использовать результирующий указатель и кучную память, а строка формата в буфере замят все поэтому я предлагаю изменить: format = "% s"; to: format = "% s \ n"; – user3629249

ответ

1

Это очень запутанный код.

Это:

vprintf(buffer, vl); 

не призыв к vsprintf(), поэтому он не будет форматировать строку в buffer, он просто будет использовать buffer в качестве строки формата, чтения арг из vl и печати на стандартный вывод ,

Но вы берете боль также разослать строку формата в buffer, что длинный ряд %s с, чтобы fd. Конечно, вы увидите там кучу %s.

Я не понимаю, почему этот код проходит через все проблемы только для создания строки форматирования, полной повторяющихся %s кодов; было бы так гораздо проще просто печатать каждую строку самостоятельно, нежели с vprintf() сделать ...

Кроме того, вы утечка памяти buffer, так как вы никогда не free() его.

+0

Спасибо за ответ! Мне нужно создать ответ http, начиная с const char * header1, .. я должен повторно собрать вместе, а позже отправить внутри fd, я знаю только этот метод. Вы предлагаете другие? И почему все второй раз у меня (null)? –

Смежные вопросы