是否可以将格式说明符视为变量?

Is it possible to treat a format specifier as a variable?

我希望此函数能够根据 specifier 参数 return 来自给定 time_t 参数的数据。

如果说明符是 'd',它应该 return 月份中的第几天 (01-31);
如果说明符是 'W',它应该 return 一年中的第几周 (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);
}

这能以某种方式完成吗?

许多(如果不是 大多数 )标准 C 函数采用“格式”参数,例如 printf 和 – 如您的代码 – strftime,将该参数作为 const char*。但是,这 意味着它必须是 字符串文字 .

您声明并写入自己的任何 char 数组(即 而不是 const)仍然可以作为 const char* 争论。因此,您可以将所需的格式说明符写入预先声明的 format 数组,然后将其传递给 strftime 函数。

在下面的代码中,我展示了如何通过将 'd''W' 分别传递给您的函数,然后将其(连同所需的 % 前缀)写入用于 strftime 调用的格式字符串。

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int get_number_atr_from_time(time_t raw_time, char specifier)
{
    struct tm* info = localtime(&raw_time);
    char buffer[3];
    char format[3] = { '%', specifier, 0 }; // Initialize as "%X", where X is
    strftime(buffer, 3, format, info);      // "specifier" - and add null char
    return atoi(buffer);
}

int main(void)
{
    time_t tNow = time(NULL);
    int dy = get_number_atr_from_time(tNow, 'd');
    int wk = get_number_atr_from_time(tNow, 'W');
    printf("D = %d, W = %d\n", dy, wk);
    return 0;
}

截至发布日期的输出:

D = 13, W = 45

请注意,有许多更有效的方法可以从 time_tstruct tm 值中检索日和周值,但上面的代码显示了如何解决 具体问题。

只需使用复合文字:

strftime(buffer, 3, (char []){'%', specifier, 0}, info);