我已经编写了这段代码(简单地说)。但它需要两个修复才行。
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,为什么?
谢谢,问候
答案 0 :(得分:1)
这是非常令人困惑的代码。
此:
vprintf(buffer, vl);
不是对vsprintf()
的调用,因此它不会将字符串格式化为buffer
,它只会使用buffer
作为格式字符串,从{{1}读取args },并打印到标准输出。
然而,你痛苦地还将vl
中的格式字符串发送到buffer
的长%s
个fd
。当然,你会在那里看到一堆%s
。
我不明白为什么这段代码只是为了构建一个充满重复%s
代码的格式化字符串而经历了所有麻烦。如果那么只需要自己打印每个字符串,而不是vprintf()
这样做...
此外,您泄漏了buffer
内存,因为您永远不会free()
。