C - string,va_list

时间:2014-10-15 13:52:16

标签: c linux

我已经编写了这段代码(简单地说)。但它需要两个修复才行。

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

添加(null),我不太清楚。

2 FIX)fd,在write()中,是一个文件描述符,它在其他函数中使用,但我的浏览器只显示%s%s%s,为什么?

谢谢,问候

1 个答案:

答案 0 :(得分:1)

这是非常令人困惑的代码。

此:

vprintf(buffer, vl);

不是对vsprintf()的调用,因此它不会将字符串格式化为buffer,它只会使用buffer作为格式字符串,从{{1}读取args },并打印到标准输出。

然而,你痛苦地vl中的格式字符串发送到buffer的长%sfd。当然,你会在那里看到一堆%s

我不明白为什么这段代码只是为了构建一个充满重复%s代码的格式化字符串而经历了所有麻烦。如果那么只需要自己打印每个字符串,而不是vprintf()这样做...

此外,您泄漏了buffer内存,因为您永远不会free()