-1

我需要从用户的字符串中获取输入(例如 20.10.2020)并添加 7 天。到目前为止,我有类似的东西,但不知道下一步该怎么做。

这是我到目前为止所拥有的:

   #include <stdio.h>

static int days_in_month[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day, month, year;

unsigned short day_counter;

int is_leap(int y) {
    return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0);
}

void next_day()
{
    day += 1; day_counter++;
if (day > days_in_month[month]) {
    day = 1;
    month += 1;
    if (month > 12) {
        month = 1;
        year += 1;
        if (is_leap(year)) {
            days_in_month[2] = 29;
        } else {
            days_in_month[2] = 28;
        }
    }
}
}

void set_date(int d, int m, int y) 
{
m < 1 ? m = 1 : 0;
m > 12 ? m = 12 : 0;
d < 1 ? d = 1 : 0;
d > days_in_month[m] ? d = days_in_month[m] : 0;
if (is_leap(y)){
    days_in_month[2] = 29;
} else {
    days_in_month[2] = 28;
}
day = d;
month = m;
year = y;
}

void skip_days(int x)
{
    int i;
    for (i=0;i<x;i++) next_day();
}

void print_date()
{
    printf (" %d.%d.%d\n", day, month, year);
}

    int main(int argc, char **argv)
    {
    int i;

    set_date(5, 2, 1980);

    skip_days(7);
    day_counter = 0;

    print_date();

    return 0;
} 
4

1 回答 1

1

你不需要重新发明轮子。评论中的一个非常好的建议是使用标准函数mktimestrftime,尽管给定的代码片段可能会使结构的某些成员tm未初始化并扭曲结果,尽管出于您的目的,没有必要打扰epoch。当我们使用

struct tm
{
    …
    int tm_mday;    // day of the month — [1, 31]
    int tm_mon;     // months since January — [0, 11]
    int tm_year;    // years since 1900
    …
}

我们可以利用这些组件的原始值不限于上述范围的情况。成功完成后,值将强制为上述范围。这意味着mktime将溢出处理到下个月或下一年。因此,您的整个程序可以简化为:

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
    int d, m, y;
    // get date input from user on the command line
    if (argc < 2 || sscanf(argv[1], "%d.%d.%d", &d, &m, &y) < 3) return 1;
    // put that into the time structure, adding 7 days
    struct tm date = { .tm_mday = d+7, .tm_mon = m-1, .tm_year = y-1900 };
    // force to the ranges
    mktime(&date);

    char s[11];
    strftime(s, sizeof s, "%d.%m.%Y", &date);
    puts(s);
}
于 2021-03-20T18:03:09.817 回答