【发布时间】:2021-12-25 12:33:06
【问题描述】:
我希望这个函数能够根据specifier 参数从给定的time_t 参数返回数据。
如果说明符是'd',它应该返回月份中的第几天(01-31);
如果说明符是'W',它应该返回一年中的第几周(00-53)。
int get_number_atr_from_time(time_t raw_time, char specifier) {
struct tm *info = localtime(&raw_time);
char buffer[3];
strftime(buffer, 3, "%specifier", info);
return atoi(buffer);
}
这可以通过某种方式完成吗?
【问题讨论】:
-
标题和标签提到了
printf,但这里没有printf。但是要回答标题中的问题:是的,作为格式字符串传递给 printf 的字符串并没有什么特别之处。尽管您永远不应该让用户定义的数据泄漏到那里,因为使用恶意定义的格式字符串可能会导致堆栈损坏。 -
如果您愿意,可以在运行时构造自己的格式字符串,但不能创建自己的说明符。不过,这可能是X-Y problem。
-
是的,可以做到。但是拥有两个功能不是那么简单吗?
-
如果要将时间字段作为整数返回,用
strftime转成字符串,再用atoi转它变回一个整数!这真的是你想做的吗? (是的,这确实让调用者以specifier的形式传入strftime将接受的任何格式说明符字符,而无需进一步解释说明符。) -
但是,是的,你可以按照你的要求去做。它看起来像
char specString[3]; construct specString using specifier; strftime(buffer, 3, specString, info);。您所要做的就是弄清楚如何在specString数组中构造一个合适的字符串。
标签: c time format-specifiers