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
相关产品推荐
相关产品推荐

