我正在尝试将用户输入日期添加到现有的时间结构中,但是出现了我不明白的错误。当我尝试修改月份日期时,编译器告诉我工作日已超出范围。代码在下面发布。
struct tm date;
int m, d, y, n;
char buffer[80];
printf("Enter a date in mm/dd/yyyy format.\n");
scanf("%d/%d/%d", &m, &d, &y);
date.tm_mday = d;
date.tm_mon = m;
date.tm_year = y - 1900;
mktime(&date);
printf("How many days would you like to advance this time?");
scanf("%d", &n);
date.tm_mday += n;
mktime(&date);
strftime(buffer, sizeof(buffer), "%c", &date);
printf("Your new date is %c", buffer);
答案 0 :(得分:2)
问题
.tm_mon
预计从 1月0日至11月。
这通常意味着从用户输入中减去1。 @dashboard
// date.tm_mon = m;
date.tm_mon = m - 1;
mktime(&date);
读取.tm_yday
和.tm_wday
之外的所有成员,OP仅设置了其中的3个成员。最好用{0}
初始化所有成员,因为我们只知道7个成员,并且还有更多 个。 @Jonathan Leffler mktime()
的返回值是否存在错误。使用"%s"
打印字符串。这意味着OP没有完全启用警告的良好编译器。节省时间并使用良好的编译器启用所有警告。
char buffer[80];
printf("Your new date is %c", buffer); // Bad specifier
将所有内容放在一起。
// struct tm date;
struct tm date = {0}; // Initialize all
int m, d, y, n;
char buffer[80];
printf("Enter a date in mm/dd/yyyy format.\n");
if (scanf("%d/%d/%d", &m, &d, &y) != 3) {
Handle_error();
}
date.tm_mday = d;
// date.tm_mon = m;
date.tm_mon = m - 1;
date.tm_year = y - 1900;
date.tm_isdst = -1; // Set dst flag to: let mktime figure it out
if (mktime(&date) == -1) {
Handle_error();
}
printf("How many days would you like to advance this time?");
scanf("%d", &n);
date.tm_mday += n;
if (mktime(&date) == -1) {
Handle_error();
}
strftime(buffer, sizeof(buffer), "%c", &date);
printf("Your new date is %s", buffer);