Альтернатива структуры тм

Существует ли какая-либо другая альтернативная структура данных вместо struct tm (имея такую ​​же память, как эта структура)? Чтобы я мог использовать strftime без объявления <time.h>

Я осознаю тот факт, что полагаться на скрытые декларации нехорошо, но я столкнулся с этим вопросом в одном из интервью.

РЕДАКТИРОВАТЬ: Чтобы быть точным, меня попросили напечатать месяц для соответствующего целого числа, используя стандартную библиотечную функцию, но не разрешено включать любой файл заголовка.

4 ответа

Нет, вам нужно использовать файл time.h.

Однако, если вы действительно хотите использовать strftime и компилировать без ошибок или предупреждений, вы можете переопределить тип данных struct в вашем C-файле, а также прототип функции для использования без включения этого файла. Вы можете называть свой тип структуры другим именем, если оно совпадает с тем, которое в настоящее время находится в вашем файле time.h.

Единственные мысли, которые у меня возникают, это то, что интервьюер ожидал печатать строки месяца, игнорируя локаль, используя собственный массив символов const char с названиями месяцев, или один из тех плохо определенных " интерактивных " вопросов, на которых вы должны остановиться и продолжать задавать вопросы, чтобы уточнить, что интервьюер на самом деле хочет. Явно вы хотите заявить, что хотите знать, какой ответ ищет интервьюер. Например, просто фрагмент короткого кода, игнорируя такие детали, как проверка ошибок и проблемы с локалью или реентерабельностью, или ответ для какой-то нестандартной встроенной или устаревшей среды, ища другие функции стандартной библиотеки C (ctime??) или платформу / ОС конкретный ответ?

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

Чистая плохая идея.:)

Использование библиотечной функции требует, чтобы вы включили заголовочный файл...

Распечатка названия месяца - я полагаю, вам разрешено 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() вам также понадобится объявление его прототипа. Вы не хотите работать там, где они считают такие сомнительные практики полезными.

Другие вопросы по тегам