[英]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.