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

