3

是否存在任何其他替代数据结构而不是struct tm(分配与此结构相同的内存)?这样我就可以strftime在不声明的情况下使用<time.h>

我知道依赖隐式声明并不好,但我在采访中遇到了这个问题。

编辑:准确地说,我被要求使用标准库函数打印相应整数的月份,但不允许包含任何头文件。

4

4 回答 4

1

不,您需要使用time.h包含文件。

但是,如果您真的想使用strftime并在没有错误或警告的情况下进行编译,您可以在 C 文件中重新定义 struct 数据类型,以及在不包含该文件的情况下使用的函数原型。只要它与time.h文件中当前的名称匹配,您就可以将结构类型称为不同的名称。

于 2010-03-05T19:22:09.380 回答
1

我唯一的想法是面试官期望打印月份字符串,使用您自己的月份名称的 const char 数组忽略语言环境,或者您应该停止并继续提问以澄清什么的那些定义不明确的“交互式”问题之一面试官确实想要。明确地你想表达你想知道面试官正在寻找什么类型的答案。例如,只是一个简短的代码片段,忽略诸如错误检查和语言环境或可重入问题之类的细节,或者一些非标准嵌入式或遗留环境的答案,寻找另一个标准 C 库函数 (ctime??),或平台/OS 具体答案?

代码:

const char* months[] = { "Jan", "Feb", ..., "Dec" };
...
printf("Month: %s\n", months[i]);

或者,如果是 Unix/Linux 系统上的疯狂“横向思考者”:

char str[PATH_MAX];
...
assert(i >= 0 && i < 12);
cmd = snprintf(cmd, sizeof(cmd), "cal %d 2010 | head -1", i);
FILE* pipe = popen(cmd);
fread(str, 1, sizeof(str), pipe);
printf("Month: %s\n", str);

纯粹的坏主意。:)

于 2010-03-05T20:37:22.163 回答
0

使用库函数需要包含头文件...

打印出月份名称(我假设您被允许stdio.h)与您是否可以使用strftime.

#include <stdio.h>

const char * months[] = {
    "January",
    "February",
    "March",
    "April",
    "May",
    ...
    "December"
};

int main () {
    int i = 0;
    for (; i < 12; ++i)
        printf ("Month %d: %s\n", i + 1, months[i]);
    return 0;
}

我对你的编辑很准确。仅使用一个int您可以打印与之关联的月份。但是,如前所述,打印本身需要包含它自己的...

于 2010-03-05T20:23:14.443 回答
0

只要您不需要访问成员,struct tm您就可以简单地使用它的前向声明,因此:

struct tm ;

但是要使用 strftime() 你还需要声明它的原型。你不想在他们认为这种可疑做法有用的地方工作。

于 2010-03-05T19:56:30.623 回答