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

是否有更简便的方式实现C语言结构体时间字段的输入?

关于C语言时间字段输入实现的优化建议

首先来看你提供的代码:

typedef struct { char product_id[10]; double price; int yr,mm,dd,hr,min,sec; int flag; } purchase_t;
void read_purchases(purchase_t *purchase[], int *num_purchase){
    int c;
    while ((c=getchar()) != EOF){
        purchase_t *new = malloc(sizeof(purchase_t));
        scanf("%s", new->product_id);
        scanf("%lf",&new->price);
        // 标记的时间输入行
        scanf("%d:%d:%d:%d:%d:%d",&new->yr,&new->mm,&new->dd,&new->hr,&new->min,&new->sec);
        scanf("%d",&new->flag);
        int i;
        for (i=strlen(new->product_id); i>=0; i--){
            new->product_id[i+1] = new->product_id[i];
        }
        new->product_id[0] = c;
        purchase[*num_purchase] = new;
        *num_purchase += 1;
    }
}

你的问题是:

当前程序可完成需求,现咨询:标记为*****的时间字段输入代码是否有更简便的实现方式,还是应沿用当前方案?


分析与可行方案

你的当前scanf方案本身是有效的,但根据场景不同,有几种更简便或更健壮的选择,也可以保留现有方案:

  • 合并多组scanf调用,简化代码结构
    你可以把分散的scanf整合成一个调用,这样既减少函数调用开销,也能让输入格式更直观:

    scanf("%s %lf %d:%d:%d:%d:%d:%d %d",
          new->product_id,
          &new->price,
          &new->yr, &new->mm, &new->dd, &new->hr, &new->min, &new->sec,
          &new->flag);
    

    这种方式代码更紧凑,能一眼看到整条输入的格式规则,只要输入的分隔符(空格、冒号)和格式字符串匹配,就能正常工作。

  • 用strptime做专业时间解析(推荐复杂场景)
    如果需要对时间格式做合法性校验,或者未来可能调整时间格式,用strptime会更专业。你可以先读取时间字符串,再解析成结构化的时间:

    char time_buf[20];
    // 先读取完整的时间格式字符串
    scanf("%19s", time_buf);
    
    struct tm tm_data = {0};
    // 按照你的输入格式解析,%Y对应年,%m对应月,以此类推
    strptime(time_buf, "%Y:%m:%d:%H:%M:%S", &tm_data);
    
    // 将tm结构的数值映射到你的结构体(注意tm的偏移规则)
    new->yr = tm_data.tm_year + 1900; // tm_year是从1900年开始的差值
    new->mm = tm_data.tm_mon + 1;     // tm_mon范围是0-11,需要加1
    new->dd = tm_data.tm_mday;
    new->hr = tm_data.tm_hour;
    new->min = tm_data.tm_min;
    new->sec = tm_data.tm_sec;
    

    这种方式的优势是自动处理时间合法性(比如月份不会超过12),格式调整只需要修改格式字符串,缺点是strptime是POSIX标准函数,部分非POSIX环境可能需要兼容处理。

  • 保留现有方案的场景
    如果你的输入格式完全固定,不需要额外校验,现有方案其实足够简单直接——代码量少、逻辑清晰,不需要引入额外的结构或函数,适合轻量场景。


另外提个小细节:你的product_id数组长度是10,在开头插入字符c时,如果原product_id长度已经是9,加上插入的字符和终止符\0会导致缓冲区溢出,建议调整数组长度或者做长度检查,避免内存越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:08:13