コード間違い探し -うるうチェッカー編- の答え

想定解答は以下の通り。

全部見つけられたかな?

今回は簡潔にするためにfscanf関数を使っていますが、scanf関数やfscanf関数の使用は推奨されていません。実際にコードを書くときはfges関数とsscanf関数などを使おう。

修正されたソースコードは以下の通り。

#include <stdio.h>
#include <string.h>

int isLeapYear(int year) {
    if (year % 4 == 0) {
        if (year % 100 != 0) {
            return 1;
        } else {
            if (year % 400 == 0) {
                return 1;
            } else {
                return 0;
            }
        }
    } else {
        return 0;
    }
}

void check(int year) {
    if (isLeapYear(year) == 1) {
        printf("%d年はうるう年です。\n", year);
    } else {
        printf("%d年はうるう年ではありません。\n", year);
    }
}

void nextLeapYear(int year) {
    int next = year + 1;
    while (isLeapYear(next) == 0) { next++; }
    printf("%d年の次のうるう年は%d年です。\n", year, next);
}

int main() {
    char buf[8]; int year;

    printf("check|next YYYY: ");
    fscanf(stdin, "%s %d", buf, &year);

    if (year < 0 || year >= 10000) {
        printf("範囲外の入力です。\n");
        return 1;
    }

    if (strcmp(buf, "check") == 0) {
        check(year);
    } else if (strcmp(buf, "next") == 0) {
        nextLeapYear(year);
    } else {
        printf("不正な入力です。\n");
        return 1;
    }

    return 0;
}