Ç的strftime已经结束十六进制字符

问题描述 投票:2回答:1

我想一个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。

c strftime
1个回答
3
投票

你已经证明我们的格式字符串将导致长度37的字符串不包括空终止符。

你的阵列应该有38元!

目前您的timebuf留下未终止的,所以你必须未定义行为任何地方,需要一个空结尾的字符串。那你有时看到\x7f和其他字符有时(大概有时甚至\0)只是纯粹的机会。


cppreference.com's C documentation on strftime

从给定的日历时间time到一个空终止多字节字符串str根据格式字符串format的日期和时间信息转换。截至count写入字节。

这里有一些资金:

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
© www.soinside.com 2019 - 2024. All rights reserved.