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

C语言手动拼接时间字符串后首字符丢失问题

问题原因与修复方案

核心错误点

  • 数组越界访问:你定义了char zone[5],数组下标范围是0-4,但代码里给zone[5]赋值,这属于越界写入,会破坏栈上的其他变量(比如buf的内容),这就是输出开头字符异常的直接原因。
  • 未初始化的数组元素:zone只初始化了前3个元素,剩下的元素是随机值,直接拼接会引入垃圾数据。
  • 缺少字符串终止符:手动拼接后没有给buf添加'\0',可能导致printf输出混乱。
  • 多余的控制字符:你的需求是输出带时区标识的时间,不需要手动添加回车(ASCII 13)和换行(ASCII 10)到字符串里。

修复后的代码

#include <stdio.h>
#include <time.h>
#include <string.h>

int main(){
   time_t rawtime;
   struct tm *info;
   char buf[80];

   time(&rawtime);
   info= localtime(&rawtime);

   // 格式化时间,预留时区位置
   strftime(buf, 80, "%a %b %d %X %Y ", info);

   // 时区标识,不需要额外控制字符
   const char *zone = "MST";
   int len1 = strlen(buf);
   // 复制时区字符串到buf末尾
   strcpy(buf + len1, zone);
   // 确保字符串终止(strcpy会自动加,手动添加更安全)
   buf[len1 + strlen(zone)] = '\0';

   printf("%s\n", buf);
}

更简洁的写法(推荐)

其实可以直接在strftime的格式字符串里添加时区标识,省去手动拼接的步骤:

#include <stdio.h>
#include <time.h>

int main(){
   time_t rawtime;
   struct tm *info;
   char buf[80];

   time(&rawtime);
   info= localtime(&rawtime);

   // 直接在格式串里加入MST
   strftime(buf, 80, "%a %b %d %X %Y MST", info);

   printf("%s\n", buf);
}

内容的提问来源于stack exchange,提问作者trying to code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:50:34