【问题标题】:Alternative of struct tmstruct tm 的替代方案
【发布时间】:2011-01-24 06:19:10
【问题描述】:

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

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

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

【问题讨论】:

  • 可能是最愚蠢的面试题
  • 是的,但是面试官非常喜欢使用`strftime而不声明!!
  • 即使打印不包括stdio.h也不好。
  • @qrdl:我知道,但是有些人在你无法打破候选人的情况下使用这样的问题,这是一种炫耀他们知识空洞的习惯!!!
  • 我认为你问错了问题。您的“精确”解释根本不需要struct tm;你把它复杂化了,只需要索引到一个字符串常量数组就可以了。唯一需要的标准库函数是 puts(),在 C89 中可以隐式声明。

标签: c time implicit-declaration


【解决方案1】:

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

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

【讨论】:

  • 给我的场景是用户输入一个整数,我必须打印月份。我写道:struct tm t;char b[10];t.tm_mon=n-1,strftime(b,10,"%B",&t);puts(b); 没有time.h 怎么办?
  • 打开 /usr/include/time.h 并将“struct tm”定义和 strftime 原型剪切并粘贴到您的源文件中。您正在声明一个 struct tm 类型的变量,但您还没有定义 struct 数据类型!
  • @Sean A.O. Harney:我希望我可以这样做 :-) 我们可以在不声明 的情况下解决这个问题吗?当然我必须使用 C 函数来获取月份名称?
  • 也许他们正在寻找的答案是使用替代的 libc 函数。我不确定。
  • @nthrgeek:我想你可能误解了你被要求做的事情。你用了strftime,然后你被问到如何在不使用time.h的情况下打印一个月,对吧?面试官的意思可能是,“如果不使用通过 time.h 提供的任何库函数,你将如何做到这一点?”,而不是“如果不包含它,你将如何调用 time.h 中的函数?”。他们可能期望有一个固定的 12 条目查找表,而不是 strftime 依赖于语言环境的行为。或者也许这是一个高级问题,他们希望您直接访问语言环境。
【解决方案2】:

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

struct tm ;

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

【讨论】:

  • 那么,如果我不访问成员,如何打印正确的月份名称:-)?
  • Err... 通过调用 strftime()。这已经知道他们了。你需要为 strftime() 声明一个原型,但你不需要包含 header。
【解决方案3】:

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

打印出月份名称 - 我假设您可以使用 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,您可以打印与之关联的月份。但是,如前所述,打印本身需要包含它自己的...

【讨论】:

    【解决方案4】:

    我唯一的想法是面试官希望打印月份字符串,使用您自己的月份名称的 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);
    

    纯粹的坏主意。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2015-03-03
      • 2015-09-25
      相关资源
      最近更新 更多