代码之家  ›  专栏  ›  技术社区  ›  whacko__Cracko

struct tm的替代品

  •  2
  • whacko__Cracko  · 技术社区  · 16 年前

    struct tm (分配了与此结构相同的内存)?所以我可以用 strftime 没有声明 <time.h>

    我知道依靠含蓄的声明是不好的,但我在一次采访中遇到了这个问题。

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

    4 回复  |  直到 16 年前
        1
  •  1
  •   Sean A.O. Harney    16 年前

    不,你需要用 时间.h 包括文件。

    但是,如果你真的想 标准时间 并且编译时不会出现错误或警告,您可以重新定义C文件中的结构数据类型,以及在不包含该文件的情况下使用的函数原型。只要结构类型与当前 时间.h 文件。

        2
  •  1
  •   mctylr    16 年前

    我唯一的想法是,要么面试官希望打印月份字符串,忽略使用自己的const char月名数组的区域设置,要么就是其中一个定义错误的字符串。” 互动的 类型 面试官正在寻找的答案。例如,仅仅是一个简短的代码片段,忽略错误检查、区域设置或可重入问题等细节,或者忽略一些非标准嵌入式或遗留环境的答案,寻找另一个标准C库函数(ctime??),或者特定于平台/操作系统的答案?

    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);
    

    完全是个坏主意。:)

        3
  •  0
  •   Clifford    16 年前

    只要你不需要访问 struct tm 您只需使用它的转发声明即可:

    struct tm ;
    

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

        4
  •  0
  •   ezpz    16 年前

    使用库函数 要求 包括头文件。。。

    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