C语言使用memcpy复制日期数据异常,仅返回年份问题排查求助
问题根因分析
- memcpy的长度使用错误,导致提取的年、月、日字符串结尾不是'\0',反而包含了原始日期里的分隔符
-:year数组长度为5,你直接复制5个字符,前4个是年份数字,第5个是原始日期第5位的-,导致year字符串实际为2019-- 同理
mth复制3个字符,前2个是月份数字,第3个是分隔符-,mth字符串为01- - 拼接后的
new_date实际内容为2019-01-06,用sscanf读取整数时,遇到-就会停止解析,所以只返回了年份数值2019
- 额外问题:不需要将局部变量声明为
static,static变量会在程序生命周期内持续占用内存,且多线程调用时会出现数据竞争问题。
修复方案
基于原有逻辑修改
int getNumDate2(char *dte) { char orig_date[26 + 1]; char new_date[8 + 1] = {0}; // 初始化全0,保证字符串结尾合法 char year[4 + 1]; char mth[2 + 1]; char day[2 + 1]; int new_date_num; strcpy(orig_date, dte); // 仅复制对应长度的数字字符,手动补字符串结束符 memcpy(year, orig_date, 4); year[4] = '\0'; memcpy(mth, orig_date+5, 2); mth[2] = '\0'; memcpy(day, orig_date+8, 2); day[2] = '\0'; // 首次拼接用strcpy替代strcat,避免new_date未初始化的问题 strcpy(new_date, year); strcat(new_date, mth); strcat(new_date, day); sscanf(new_date,"%d", &new_date_num); return new_date_num; }
更简洁的实现(无需字符串拼接)
int getNumDate2(char *dte) { int year, month, day; // 直接从原始日期字符串按格式读取年、月、日 sscanf(dte, "%4d-%2d-%2d", &year, &month, &day); // 直接计算得到YYYYMMDD格式整数 return year * 10000 + month * 100 + day; }
内容的提问来源于stack exchange,提问作者Jaguar Nation
相关产品推荐
相关产品推荐

