C strftime 有结束的十六进制字符

C strftime has ending hex characters

我正在尝试将 Date header 添加到我的 HTTP 响应中。到目前为止,我一直在做这样的事情:

char timebuf[37];
time_t now = time(0);
struct tm tm = *gmtime(&now);
strftime(timebuf, sizeof timebuf,"Date: %a, %d %b %Y %H:%M:%S %Z\r\n", &tm);)

但是,在检查 timebuf 时,我有时(比如在服务器的第一个请求中)收到一个 \x7f 结束字符。

为什么不一致?我仔细检查了 timebuf 的大小,它应该正好是 37。

您向我们展示的格式字符串将生成长度为 37 的字符串。不包括 NULL 终止符。

你的数组应该有 38 个元素!

目前您的 timebuf 未终止,因此您在任何需要空终止字符串的地方都有未定义的行为。您有时会看到 \x7f,有时会看到其他角色(大概有时甚至 [=13=])纯属偶然。


来自 cppreference.com's C documentation on strftime:

Converts the date and time information from a given calendar time time to a null-terminated multibyte character string str according to format string format. Up to count bytes are written.

这里有一些总和:

Substr     Length
---------+--------
"Date: "     6
"%a"         3
", "         2
"%d"         2
" "          1
"%b"         3
" "          1
"%Y"         4
" "          1
"%H"         2
":"          1
"%M"         2
":"          1
"%S"         2
" "          1
"%Z"         4
"\r\n"       2

NULL term.   1
-----------------
         =   38