C言語を思い出すために書いてみた。所要時間1時間。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// メイン関数
int main(int argc, char* argv[]) {
// today変数にNULLをセットする
time_t today = time(0);
// localtimeはNULLを現在時刻として解釈する
struct tm* day = localtime(&today);
// 2020/7/13 → 2020/7/1に変更する
day->tm_mday = 1;
// プログラム開始時の引数が1個のとき (./cal 7)
if (argc > 1) {
// "7" -> 7
int month = atoi(argv[1]);
if ( month == 0 ) {
fprintf(stderr, "Can't parse month text.\n");
return 1;
}
day->tm_mon = month - 1;
}
// プログラム開始時の引数が2個のとき (./cal 7 2020)
if (argc > 2) {
int year = atoi(argv[2]);
if ( year == 0 ){
fprintf(stderr, "Can't parse year text.\n");
return 1;
}
day->tm_year = year - 1900;
}
// カレンダーを表示させたい月をdayに設定する
time_t st = mktime(day);
char buf[256];
strftime(buf, sizeof(buf), "%Y/%m", day);
printf(" %s\n", buf);
printf("Su Mo Tu We Th Fr Sa\n");
// 1日までは空っぽ文字で表示しておく
for ( int i = 0; i < day->tm_wday; ++i ) {
printf(" ");
}
// カレンダー表示対象の月を覚えておく
int month = day->tm_mon;
// dayがカレンダー表示対象の月の間だけ出力する (翌月になったらwhileから抜ける)
while (month == day->tm_mon) {
printf("%2d ", day->tm_mday);
if ( day->tm_wday == 6 ) {
printf("\n");
}
// dayに1日足す
day->tm_mday += 1;
st = mktime(day);
day = localtime(&st);
}
printf("\n");
return 0;
}