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

strcat无法追加冒号?OLED屏幕时间格式化问题求助

时间拼接中冒号消失的原因分析

问题代码

char* oledScreen::getCurrentTime(){
   char* hour = malloc(16);
   snprintf(hour, 16, "%d", getHour());

   char* minute = malloc(16);
   snprintf(minute, 16, "%d", getMinute());

   char* firstPart = strcat(getHour() < 10 ? strcat("0",hour) : hour, ":");
   const char* secondPart = getMinute() < 10 ? strcat("0",minute) : minute;

   return strcat(firstPart, secondPart);
};

需求与问题

我尝试通过getHour()和getMinute()获取两个整数并拼接,需求是:若小时或分钟小于10,则在其前补0,输出格式为0X(X为对应时间值)。当前问题是冒号字符无法被追加,例如getHour() = 9、getMinute() = 15时,getCurrentTime()输出为0915而非预期的09:15。

核心原因

  1. 字符串字面量不可修改:strcat("0", hour)是严重错误。"0"是字符串字面量,存储在只读内存区域,strcat会试图往这个只读内存后面追加hour的内容,这属于未定义行为,会直接破坏内存结构,导致后续追加冒号的操作失效。
  2. 内存操作逻辑混乱:多次使用strcat但没有确保目标缓冲区有足够空间,同时分配的hour和minute内存没有正确释放,存在内存泄漏问题;最终返回的指针可能指向非法内存区域,进一步引发不可预测的错误。

正确实现方案

不需要复杂的内存分配和字符串拼接,直接用snprintf的格式符一次性完成格式化,既安全又高效:

char* oledScreen::getCurrentTime(){
    char* timeStr = malloc(16); // 足够容纳"HH:MM"及字符串终止符
    if (!timeStr) return NULL; // 处理内存分配失败的边界情况
    snprintf(timeStr, 16, "%02d:%02d", getHour(), getMinute());
    return timeStr;
};

说明

%02d是格式化整数的格式符,含义是:输出至少2位数字,当数字小于10时自动在前面补0,完美匹配补0需求;同时只需要一次内存分配,避免了之前的所有内存问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:35