为什么在strptime之前需要memset

时间:2020-03-24 00:10:39

标签: strptime memset

为使此代码正常运行,必须使用memset。为什么呢?

struct tm temp;
memset(&temp, 0, sizeof(struct tm));
strptime(str.c_str(), "%d-%m-%Y", &temp);

为什么这还不够?

struct tm temp;
strptime(str.c_str(), "%d-%m-%Y", &temp);

非常感谢。

1 个答案:

答案 0 :(得分:0)

由于strptime specification中有这个小片段(我的重点是):

适当的 tm结构成员的

值设置为与语言环境信息相对应的值。

换句话说,它不一定设置tm结构的 all 字段,因此您首先将所有内容初始化为零。否则,作为局部变量,在解析时间字符串之前(以及之后,除非您明确地解析适当的项目),它可能在所有字段中都有任意信息。

之所以这样做(跳过您未明确解析的字段)的原因之一是因为您可能已经设置了tm,并且只想更改某些字段(例如,使用time()localtime()获取今天的tm,然后解析5pm以获取今天的特定时间。

很有可能,如果您只想查看解析的字段,则不必担心先清零。但是可能还会有 possibility ,谁写了您的strptime实现的人“太聪明了”,并决定他们可以对数据进行后期处理以解决问题。例如,如果您将26:00:00作为时间,并且解析了March 1的日期,则可能会将其调整为March 2, 02:00:00

我并不是说这是有可能的(甚至是规范所允许的),但考虑到事前将结构归零的最低成本,我可能宁愿选择安全的方法。特别是因为那里有很多人“太聪明了”:-)