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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:24:03