簡體   English   中英

計算兩個日期之間的天數的C程序

[英]C program that calculates number of days between two dates

我寫了一個C程序來計算兩個日期之間的天數。 不幸的是,它無法正確編譯。 我不知道為什么 有人可以幫我修復代碼嗎? 似乎SCANF和PRINTF函數存在一些問題。 我什至沒有機會輸入自己的日期。

這是我得到的輸出:非法日期-1607965827

請幫我。 提前致謝!

#include <stdio.h>
#include <stdlib.h>

int days_in_month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

struct date {
  int day;
  int month;
  int year;
};

int leap_year(int year) {
    if(year%400==0) return 1;

    if(year%4==0 && year%100!=0) return 1;

    return 0;
}

int correct(struct date d) {
    if(d.day < 1 || d.day > days_in_month[d.month]) return 0;

    if(d.month < 1 || d.month > 12) return 0;

    return 1;
}

int number_of_days(struct date d) {
    int result = 0;
    int i;

    for(i=1; i < d.year; i++) {
        if(leap_year(i))
            result += 366;
        else
            result += 365;
    }

    for(i=1; i < d.month; i++) {
        result += days_in_month[i];

        if(leap_year(d.year) && i == 2) result++;
    }

    result += d.day;
    return result;
}

int main() {
    struct date first, second;
    int days;

    scanf("%d %d %d", first.day, first.month, first.year);
    scanf("%d %d %d", second.day, second.month, second.year);

    if(!correct(first) || !correct(second)) {
        printf("Illegal date\n");
    }

    days = number_of_days(first) - number_of_days(second);

    printf("%d", days);

    return 0;
}

您需要使用傳遞給scanf的參數地址(使用&)

有兩個問題:
1.在main()中,first.day是變量的名稱,而我們必須在scanf(“%d”,&first.day);中傳遞變量的引用(地址);

2.如果(第二個日期大於第一個日期)您的天數可能是負數,那么您確定可以解決此問題。

scanf()用法不正確。 %d需要匹配的int * ,而不是int 另外,請務必檢查輸入功能的返回值。 您將節省時間。 除非返回代碼符合預期,否則不要信任first.day輸入,以希望獲得有效的值。 @MikeCAT

一個好的編譯器會警告格式不匹配。 啟用所有編譯器警告或獲取新的編譯器。

// scanf("%d %d %d", first.day, first.month, first.year);
if (scanf("%d %d %d", &first.day, &first.month, &first.year) != 3) {
  puts("Bad input");
  return -1;
}

其他問題包括:

days_in_month[d.month])不考慮leap年。 @BLUEPIXY
int main()不可移植/正確-使用int main(void)`。

次要內容:
leap_year() ,與1582年之前的年份有關。可以在correct()添加年份測試。 if (year > 1582) good();
int范圍可能不足以表示天數,請使用long
for(i=1; i < d.year; i++)是無效的。
避免像i == 2這樣的幻數
按地址傳遞結構比傳遞值更常見。
"%d%d%d"也將代替"%d %d %d"

BYW:很好地使用結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM