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
我正在尝试将 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 stringstr
according to format stringformat
. Up tocount
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