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

如何不使用scanf函数以mm/dd/yy格式读取用户输入?

不用scanf读取mm/dd/yy格式日期的简洁方案

确实,scanf处理输入时很容易留下缓冲区残留、格式匹配容错差的问题,避开它是个很稳妥的选择。这里给你一个步骤最少且合规的实现思路:用fgets读取整行输入,再配合sscanf(注意是处理字符串的sscanf,不是直接读标准输入的scanf)来解析格式,既安全又高效。

具体实现代码

#include <stdio.h>
#include <string.h>

int main() {
    char input_buf[20]; // 足够容纳mm/dd/yy格式输入,留足冗余空间
    int month, day, year;

    printf("请输入日期(格式:mm/dd/yy):");
    // 读取整行输入,避免缓冲区残留问题
    if (fgets(input_buf, sizeof(input_buf), stdin) != NULL) {
        // 移除fgets可能读取到的换行符,保证字符串格式干净
        input_buf[strcspn(input_buf, "\n")] = '\0';
        
        // 用sscanf从字符串中解析日期,严格匹配mm/dd/yy格式
        if (sscanf(input_buf, "%d/%d/%d", &month, &day, &year) == 3) {
            // 可选:添加日期合法性校验(比如月份1-12,日期对应月份的有效天数)
            printf("解析成功:%02d月%02d日%02d年\n", month, day, year);
        } else {
            printf("输入格式错误,请按照mm/dd/yy的格式输入!\n");
        }
    } else {
        printf("读取输入失败,请检查输入状态!\n");
    }
    return 0;
}

为什么这个方案靠谱?

  • fgets读取整行:一次性把用户输入的整行(包括换行符)读入缓冲区,不会像scanf那样留下未处理的字符在输入流里,避免后续输入逻辑出错;
  • strcspn清理换行符:fgets会把用户按下的回车(\n)也读进来,用strcspn可以精准定位并替换成字符串终止符,保证后续解析不受干扰;
  • sscanf安全解析:它只处理内存中的字符串,不会直接操作标准输入,没有scanf的缓冲区溢出风险,同时还能精准匹配mm/dd/yy的分隔符格式;
  • 可扩展性强:如果需要更严格的日期校验(比如判断2月的天数、闰年等),直接在解析成功后加逻辑即可,不影响核心输入读取流程。

如果完全不想用任何scanf家族函数,也可以手动遍历字符串提取数字并校验分隔符,但那样代码量会大很多,步骤也更多,所以上面的方案是兼顾简洁性和安全性的最优解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:56:42