【C语言】NextDay问题

输入一个时间,某年某月某日,输出下一天
主要就是边界控制,不使用愚蠢写法,无技术含量,仅仅逻辑性考验
注释完善,自行理解

执行环境:Ubuntu18.04  CLion/GCC		
					   WIndows环境也无需修改

Code:

/*  Next Day
 * 注意:紧扣题意,输入格式为:xx年xx月xx日,正好利用这锻炼格式化字符串sscanf()函数
 * 至于例如2019 02 25这种格式,如此一来,写的更没意思了
 * 包括多此一举在堆区开辟空间,同时也避免了用户故意无限输入导致栈区溢出问题
 * 学习软件测试,就要考虑到万无一失
 * 考研的同学可以多了解这些函数
 *
 * */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    //定义13个长度,0号索引不使用,避免后期+1操作
    int monArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    printf("输入年月日[Format:xx年xx月xx日]:\n");

    //堆区开辟空间,栈区空间Windows默认只有1M,Linux一般默认8M,可以扩大,在此不做赘述
    char *time = malloc(64);
    scanf("%s", time);

    int year, mon, day;

    //格式化字符串置于对应变量中
    sscanf(time, "%d年%d月%d日", &year, &mon, &day);

    //判断闰年后2月份数组天数加一
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        monArray[2]++;

    //月,日未超范围
    if ((mon <= 12 && mon >= 1) && (day <= monArray[mon])) {
        //月尾判断
        if (day == monArray[mon]) {
            //到达年尾
            if (mon == 12) {
                day = 1;
                mon = 1;
                year++;
            }
                //只达到月尾
            else {
                day = 1;
                mon++;
            }
        }
            //月日均为超范围
        else {
            day++;
        }
    }
        //月日超范围,直接return
    else {
        printf("Data Error\n");
        return EXIT_FAILURE;
    }

    //计算成功
    printf("Next Day is:%d年%d月%d日\n", year, mon, day);
    return EXIT_SUCCESS;
}

在这里插入图片描述

发布了44 篇原创文章 · 获赞 68 · 访问量 5133

猜你喜欢

转载自blog.csdn.net/qq_25404477/article/details/100714320