首页 > 解决方案 > C strftime 有结束的十六进制字符

问题描述

我正在尝试向Date我的 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。

标签: cstrftime

解决方案


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

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

目前您timebuf的未终止,因此您在任何需要空终止字符串的地方都有未定义的行为。您\x7f有时会看到其他角色(可能甚至\0有时会看到)只是纯粹的机会。


来自cppreference.com 的 C 文档strftime

根据格式 string将日期和时间信息从给定的日历时间time转换为以 null 结尾的多字节字符串。最多写入字节。strformatcount

这里有一些总和:

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

推荐阅读