是否有更简便的方式实现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
相关产品推荐
相关产品推荐

