struct tm
(この構造と同じメモリが割り当てられている)の代わりに、他の代替データ構造が存在しますか?strftime
宣言せずに使えるように<time.h>
暗黙の宣言に頼るのは良くないということは承知していますが、インタビューでこの質問に直面しました。
編集:正確には、標準ライブラリ関数を使用して対応する整数の月を出力するように求められましたが、ヘッダー ファイルを含めることは許可されていません。
struct tm
(この構造と同じメモリが割り当てられている)の代わりに、他の代替データ構造が存在しますか?strftime
宣言せずに使えるように<time.h>
暗黙の宣言に頼るのは良くないということは承知していますが、インタビューでこの質問に直面しました。
編集:正確には、標準ライブラリ関数を使用して対応する整数の月を出力するように求められましたが、ヘッダー ファイルを含めることは許可されていません。
私が持っている唯一の考えは、インタビュアーが月の文字列を印刷することを期待していたか、独自の月名の 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);
まったく悪い考えです。:)
いいえ、 time.hインクルード ファイルを使用する必要があります。
ただし、本当にstrftimeを使用してエラーや警告なしでコンパイルしたい場合は、C ファイルで構造体データ型を再定義し、そのファイルを含めずに使用する関数プロトタイプを再定義することができます。現在time.hファイルにあるものと一致する限り、構造体型を別の名前で呼び出すことができます。
ライブラリ関数を使用するには、ヘッダー ファイルを含める必要があります...
月の名前を出力することは (許可されていると思い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() を使用するには、そのプロトタイプの宣言も必要です。そのような疑わしい慣行が有用であると彼らが考えている場所で働きたくありません。