是否存在任何其他替代数据结构而不是struct tm
(分配与此结构相同的内存)?这样我就可以在不声明strftime
<time.h>
我知道依赖隐含声明并不好,但我在接受采访时遇到了这个问题。
编辑:准确地说,我被要求使用标准库函数打印月份以获得相应的整数,但不允许包含任何头文件。
答案 0 :(得分:1)
不,您需要使用 time.h 包含文件。
但是,如果您确实想要使用 strftime 并在没有错误或警告的情况下进行编译,则可以在C文件中重新定义struct数据类型,也可以在不包含该文件的情况下重新定义要使用的函数原型。您可以将结构类型称为不同的名称,只要它与 time.h 文件中当前的名称匹配即可。
答案 1 :(得分:1)
我唯一的想法是面试官预期打印月份字符串,使用您自己的const char月份名称数组忽略语言环境,或者是那些定义不明确的“交互式”问题假设停下来并不断提问,以澄清面试官实际想要的内容。明确地,您想要表达您想知道面试官正在寻找的答案的类型。例如,只是一个简短的代码片段,忽略错误检查和区域设置或重入问题等细节,或者某些非标准嵌入式或遗留环境的答案,寻找另一个标准C库函数(ctime ??)或平台/ OS具体答案?
ObCode:
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);
纯粹的坏主意。 :)
答案 2 :(得分:0)
只要您不需要访问struct tm
的成员,就可以简单地使用它的前向声明:
struct tm ;
但是要使用strftime(),你还需要声明其原型。你不想在他们认为这种可疑行为有用的任何地方工作。
答案 3 :(得分: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
,您可以打印与之关联的月份。但是,正如已经提到的那样,印刷本身需要包括它自己的......