如何在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
相关产品推荐
相关产品推荐

