是否存在任何其他替代数据结构而不是struct tm
(分配与此结构相同的内存)?这样我就可以strftime
在不声明的情况下使用<time.h>
我知道依赖隐式声明并不好,但我在采访中遇到了这个问题。
编辑:准确地说,我被要求使用标准库函数打印相应整数的月份,但不允许包含任何头文件。
是否存在任何其他替代数据结构而不是struct tm
(分配与此结构相同的内存)?这样我就可以strftime
在不声明的情况下使用<time.h>
我知道依赖隐式声明并不好,但我在采访中遇到了这个问题。
编辑:准确地说,我被要求使用标准库函数打印相应整数的月份,但不允许包含任何头文件。
不,您需要使用time.h包含文件。
但是,如果您真的想使用strftime并在没有错误或警告的情况下进行编译,您可以在 C 文件中重新定义 struct 数据类型,以及在不包含该文件的情况下使用的函数原型。只要它与time.h文件中当前的名称匹配,您就可以将结构类型称为不同的名称。
我唯一的想法是面试官期望打印月份字符串,使用您自己的月份名称的 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);
纯粹的坏主意。:)
使用库函数需要包含头文件...
打印出月份名称(我假设您被允许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
您可以打印与之关联的月份。但是,如前所述,打印本身需要包含它自己的...
只要您不需要访问成员,struct tm
您就可以简单地使用它的前向声明,因此:
struct tm ;
但是要使用 strftime() 你还需要声明它的原型。你不想在他们认为这种可疑做法有用的地方工作。