为了使此代码正常运行,必须使用 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);
多谢。
由于strptime
规范中的这个小片段(我的重点):
适当的结构成员的值
tm
被设置为对应于语言环境信息的值。
换句话说,它不一定设置结构的所有字段tm
,因此您首先将所有内容初始化为零。否则,作为一个局部变量,它可能在解析时间字符串之前(以及之后,除非您明确解析适当的项目)在其所有字段中包含任意信息。
它这样做的一个原因(跳过你没有明确解析的字段)是因为你可能已经有了一个tm
设置并且你只想更改某些字段(例如,使用time()
和localtime()
获取tm
今天的内容,然后解析下午 5 点以获取今天的特定时间)。
很有可能,如果您只想查看已解析的字段,则不必担心先归零。但也有可能是编写您的strptime
实现的人“太聪明了”,并决定他们可以对数据进行后期处理以解决问题。例如,如果您有26:00:00
时间,并且您将日期解析为March 1
,它可能会将其调整为March 2, 02:00:00
。
我并不是说这很可能(或者甚至是规范允许的)但是,考虑到事先将结构归零的成本最低,我可能更愿意安全一些。特别是因为有很多人“太聪明了”:-)
“不够”是什么意思?struct tm有 9 个不同的字段,它们是提供的日期/时间信息的一部分strptime。根据您提供的格式,该函数将填写它可以从您的字符串中解析的字段。如果您需要将未引用的其他字段设置为 0,则strptime希望您自己执行此操作。它不会预先假设您要将它们初始化为什么。您可以选择将它们设置为其他内容,无论是来自先前的计算还是事件。
使用 struct tm temp 时,tm 不会接管内存 sizeof(struct tm) 字节吗?为什么我们需要内存集?
memset 不分配内存。它将它初始化为 0。声明该结构不会为您将其初始化为 0。
但我不想使用所有字段,只使用 strptime 中格式中提到的字段。
@dklovedoctor 那么您可能不需要使用 memset 将其余部分设置为 0。但是这样做有什么坏处呢?