c - 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。
解决方案
您向我们展示的格式字符串将生成长度为 37 的字符串。不包括NULL 终止符。
你的数组应该有 38 个元素!
目前您timebuf
的未终止,因此您在任何需要空终止字符串的地方都有未定义的行为。您\x7f
有时会看到其他角色(可能甚至\0
有时会看到)只是纯粹的机会。
来自cppreference.com 的 C 文档strftime
:
根据格式 string将日期和时间信息从给定的日历时间
time
转换为以 null 结尾的多字节字符串。最多写入字节。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
推荐阅读
- java - 卷积内核 - 图像以镜像形式出现
- java - Galaxy S20 不调用 onSensorChanged 方法,但可以在另一台设备上运行
- javascript - 圆圈中的图像地图编号
- javascript - 如何在javascript中将JSON数据转换为数组
- python - 使用 Python 在全屏游戏中移动鼠标
- powershell - 用于解析字符串的 Powershell 脚本
- python - 用于训练多输入功能 keras 模型的几个 x 输入的格式
- laravel - 多级关系 whereHas
- macos - 如何在 Mac 上将超宽显示器拆分为虚拟显示器?
- python - 当顶层重复时,如何使用 python 抓取代码?