qq_52781625 2021-09-07 23:35 采纳率: 0%
浏览 58

关于#c语言#的问题: 定义一个日期结构体保存日期,具体信息为:年、月、日 判断出生日期的格式是否合法时,9-10位表示的日期分别转换成整数

 定义一个日期结构体保存日期,具体信息为:年、月、日
 判断出生日期的格式是否合法时,需要判断长度是否为10,第5位和第8位是否为’-’,字符,将1-4位表示的年份,6-7位表示的月份,9-10位表示的日期分别转换成整数。判断是否满足构成日期的条件闰年月份只能是1-12之间的数,如果是闰年,二月可以是29天否则不能大于28,1,3,5,7,8,10,12月可以是31天,其余只能小于等于30(建议写成函数)。

  • 写回答

1条回答 默认 最新

  • qfl_sdu 2021-09-07 23:56
    关注

    如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct StDate 
    {
        int year,mon,day;
        StDate(){}
        StDate(int y,int m,int d)
        {
            year = y;
            mon = m;
            day = d;
        }
    };
    
    int isValid(char* str,struct StDate *st)
    {
        int falg = 1,i;
        char tmp[8] = {0};
        int year,mon,day;
        //判断长度
        if(strlen(str) != 10)
            return 0;
        //判断第5/8位是否是-
        if(str[4] != '-' || str[7] != '-')
            return 0;
        //判断1-4,6-7/9-10是否是数字
        for ( i = 0;i<4;i++)
        {
            if(str[i] < '0' || str[i] > '9')
                return 0;
        }
        for (i = 5;i<7;i++)
        {
            if(str[i] < '0' || str[i] > '9')
                return 0;
        }
        for (i = 8;i<10;i++)
        {
            if(str[i] < '0' || str[i] > '9')
                return 0;
        }
    
        strcpy_s(tmp,4,str);
        year = atoi(tmp);
    
        strcpy_s(tmp,2,str+5);
        tmp[3] = 0;
        mon = atoi(tmp);
    
        strcpy_s(tmp,2,str+8);
        tmp[3] = 0;
        day = atoi(tmp);
    
        if(year < 0) return 0;
        if(mon < 1 || mon > 12) return 0;
        
        if(mon == 2)
        {
            //判断是否是闰年
            if (year%4 == 0 && year%100 != 0)
            {
                if(day < 1 || day > 29)
                    return 0;
            }else
            {
                if(day < 1 || day > 28)
                    return 0;
            }
        }else if (mon == 1 || mon == 3 || mon == 5 || mon== 7 || mon == 8 || mon==10 || mon==12)
        {
            if(day <1 || day >31)
                return 0;
        }else 
        {
            if(day < 1 || day > 30)
                return 0;
        }
        st->year = year;
        st->mon = mon;
        st->day = day;
        return 1;
    }
    
    int main()
    {
        char buf[20]={0};
        struct StDate dt;
        scanf("%s",buf);
        if (isValid(buf,&dt))
        {
            printf("合法,日期:%d-%d-%d\n",dt.year,dt.mon,dt.day);
        }else
            printf("不合法\n");
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月7日

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制