You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中实现输入出生日期并按DD/MM/YYYY格式存入结构体

C语言:将出生日期格式化为DD/MM/YYYY存入结构体

问题背景

用户现有以下C语言代码,希望将输入的日、月、年整理为DD/MM/YYYY格式(例如19/04/2023),并存入结构体的DateBirth字段中:

#include <stdio.h>

// create a struct to store users information
struct  user
    {
        int ID;
        char Username[50];
        char DateBirth[50];
        char Class[10];
    };
int InputUser(){

    int n;
    int Date;
    int Month;
    int Year;
    user u;
    printf("\nName:");
    gets(u.Username);
    printf("\nID: ");
    scanf("%d",&u.ID);
    printf("\nClass: ");
    gets(u.Class);
    printf("\nDate: ");
    scanf("%d",&Date);
    printf("\nMonth: ");
    scanf("%d",&Month);
    printf("\nYear: ");
    scanf("%d",&Year);

    return 0;
}

解决方案

核心实现:用sprintf格式化日期

要把输入的Date(日)、Month(月)、Year(年)拼接成DD/MM/YYYY格式,直接使用sprintf函数即可,它能将格式化后的字符串写入指定字符数组。关键是用%02d格式符,确保单个数字的日/月自动补零(比如4变成04)。

同时修正原代码的其他问题

原代码存在几个隐患:

  • gets函数不安全,容易导致缓冲区溢出,建议替换为fgets
  • 直接使用user u错误,C语言中结构体变量声明需要加上struct,或者给结构体起别名
  • scanf读取整数后,输入缓冲区会残留换行符,会干扰后续的fgets读取,需要手动清除缓冲区

修改后的完整代码

#include <stdio.h>
#include <string.h> // 用于strcspn函数处理换行符

// 定义用户结构体,用typedef简化后续变量声明
typedef struct user
{
    int ID;
    char Username[50];
    char DateBirth[10]; // DD/MM/YYYY共9个可视字符+1个结束符'\0',10长度足够
    char Class[10];
} User;

int InputUser()
{
    int Date, Month, Year;
    User u; // 用typedef后的别名声明结构体变量

    // 读取用户名,处理fgets带来的换行符
    printf("Name: ");
    fgets(u.Username, sizeof(u.Username), stdin);
    u.Username[strcspn(u.Username, "\n")] = '\0'; // 替换换行符为字符串结束符

    // 读取ID,清除scanf后残留的换行符
    printf("ID: ");
    scanf("%d", &u.ID);
    while (getchar() != '\n'); // 清空缓冲区直到遇到换行

    // 读取班级
    printf("Class: ");
    fgets(u.Class, sizeof(u.Class), stdin);
    u.Class[strcspn(u.Class, "\n")] = '\0';

    // 读取日期组件
    printf("Date: ");
    scanf("%d", &Date);
    printf("Month: ");
    scanf("%d", &Month);
    printf("Year: ");
    scanf("%d", &Year);

    // 格式化日期并存入DateBirth字段
    sprintf(u.DateBirth, "%02d/%02d/%04d", Date, Month, Year);

    // 可选:验证格式化结果
    printf("\n格式化后的出生日期:%s\n", u.DateBirth);

    return 0;
}

// 主函数用于测试
int main()
{
    InputUser();
    return 0;
}

关键代码解释

  • sprintf(u.DateBirth, "%02d/%02d/%04d", Date, Month, Year):
    • %02d:强制将日/月格式化为两位数字,不足两位时自动补0
    • %04d:确保年份以四位数字展示(若输入两位年份会补前导零,建议直接输入四位年份)
    • 生成的字符串长度刚好适配DateBirth[10]的空间
  • strcspn(u.Username, "\n"):快速定位换行符位置,替换为'\0'以去除fgets读取到的换行
  • while (getchar() != '\n'):清除scanf读取整数后留在缓冲区的换行符,避免干扰后续的字符串读取

内容的提问来源于stack exchange,提问作者Dinosour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:23:09