C语言如何在结构体中内置timestamp,实现带时间戳的结构体数组功能
实现方案
你的需求需要调整结构体定义、新增时间戳赋值逻辑、封装打印函数三个部分完成,具体修改如下:
1. 修正并补充结构体定义
你原代码存在笔误:定义的结构体名为struct St,但声明数组时错写为struct S1,同时需要在结构体中新增时间戳成员,C标准库<time.h>中的time_t类型默认存储秒级Unix时间戳,完全满足常规使用需求:
// 需提前引入对应的头文件 #include <stdio.h> #include <time.h> #include <string.h> struct St { char Aps[65]; // 原有存储字符串的成员 time_t timestamp; // 新增时间戳成员 }; // 修正结构体名,声明长度为20的结构体数组 struct St Arr[20];
2. 封装结构体元素初始化函数
每次给数组成员赋值时同步写入当前时间戳,避免手动赋值遗漏:
// 初始化St结构体实例的函数 void init_st(struct St *obj, const char *content) { // 拷贝字符串内容到Aps成员,做长度限制避免越界 strncpy(obj->Aps, content, sizeof(obj->Aps) - 1); obj->Aps[sizeof(obj->Aps) - 1] = '\0'; // 获取当前秒级时间戳存入结构体 time(&obj->timestamp); }
3. 封装打印函数实现需求
调用该函数打印单个结构体元素时,会同时输出可读时间、原始时间戳、字符串内容:
// 打印单个St结构体内容的函数 void print_st(const struct St *obj) { // ctime会直接把time_t转成"Wed Jun 30 21:49:08 1993\n"格式的可读时间 printf("时间:%s", ctime(&obj->timestamp)); printf("原始时间戳:%ld\n", (long)obj->timestamp); printf("字符串内容:%s\n", obj->Aps); printf("---------------------------\n"); }
完整使用示例
#include <unistd.h> // 仅用于示例中的sleep函数,Windows环境可替换为Sleep(1000) int main() { // 给数组前两个元素赋值测试 init_st(&Arr[0], "第一条测试内容"); // 模拟间隔1秒的操作 sleep(1); init_st(&Arr[1], "第二条测试内容"); // 打印两个元素 print_st(&Arr[0]); print_st(&Arr[1]); return 0; }
可选扩展
如果需要毫秒级/微秒级时间戳,可以把时间戳成员替换为struct timeval类型,使用gettimeofday()函数获取更高精度的时间即可。
内容的提问来源于stack exchange,提问作者gagaaa
相关产品推荐
相关产品推荐

