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

C语言中输入日期时,仅输入1如何输出01-00-0000的dd-mm-yyyy格式?

问题:C语言日期输入未补全时的默认值处理

我用以下C语言代码实现日期的输入输出:

printf("Date Order time\t\t: ");scanf("%02d-%02d-%04d", &d, &m, &y);
printf("\nDate order\t\t: %02d-%02d-%04d", d, m, y);

当我仅输入1时,得到的输出为:

Date Order           : 01-4227112-0000

我期望得到的输出是:

Date Order          : 01-00-0000

请问如何实现该需求?


解决方案

1. 初始化变量为0

scanf读取失败时不会修改对应变量的值,你看到的4227112是变量m未初始化的栈内存随机值。第一步必须把日期变量初始化为0:

// 初始化变量为0,确保未读取到值时显示默认0
int d = 0, m = 0, y = 0;
printf("Date Order time\t\t: ");
scanf("%02d-%02d-%04d", &d, &m, &y);
printf("\nDate order\t\t: %02d-%02d-%04d", d, m, y);

2. 清空输入缓冲区

当只输入1时,scanf会读取d为1,但后续的-、m、y都读取失败,输入缓冲区会残留换行符等垃圾数据,可能影响后续输入操作。在scanf后添加代码清空缓冲区:

// 清空输入缓冲区中剩余的所有字符,直到遇到换行
while (getchar() != '\n');

3. 更健壮的整行输入处理(推荐)

如果要兼容用户输入不完整格式的场景,建议先用fgets读取整行输入,再用sscanf解析。这种方式能确保未匹配的变量保持初始0值,同时不会留下缓冲区垃圾:

char input[20] = {0};
int d = 0, m = 0, y = 0;

printf("Date Order time\t\t: ");
// 读取整行输入,避免缓冲区残留问题
fgets(input, sizeof(input), stdin);
// 解析输入,未匹配的变量保持初始0
sscanf(input, "%02d-%02d-%04d", &d, &m, &y);

printf("\nDate order\t\t: %02d-%02d-%04d", d, m, y);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:34:56