关于gettimeofday的技术问题:无空格显示时间与无数组格式化时间
让我来一步步解答你的两个问题:
问题1:如何使用gettimeofday函数显示当前时间且不使用空格?
要实现无空格的时间输出,核心是调整时间格式的拼接方式,全程避免插入空格。具体可以通过两种方式实现:
方式一:修改strftime格式字符串
利用strftime生成无空格的时间前缀,再拼接微秒部分:
#include <stdio.h> #include <sys/time.h> #include <time.h> int main() { struct timeval tv; time_t curtime; gettimeofday(&tv, NULL); curtime = tv.tv_sec; // 把原格式中的空格去掉,比如将"%m-%d-%Y %T"改为"%m-%d-%Y%T" char buffer[30]; strftime(buffer, sizeof(buffer), "%m-%d-%Y%T.", localtime(&curtime)); printf("%s%ld\n", buffer, tv.tv_usec); // 输出示例:09-15-202414:35:22.123456 return 0; }
方式二:直接printf输出时间字段(无需临时缓冲区)
如果不想用数组,还可以直接解析tm结构体的成员,用printf直接输出所有时间部分:
#include <stdio.h> #include <sys/time.h> #include <time.h> int main() { struct timeval tv; struct tm *local_tm; gettimeofday(&tv, NULL); local_tm = localtime(&tv.tv_sec); // 逐个输出时间字段,全程无空格 printf("%02d-%02d-%04d%02d:%02d:%02d.%ld\n", local_tm->tm_mon + 1, // tm_mon从0开始计数,需+1 local_tm->tm_mday, local_tm->tm_year + 1900, // tm_year是1900年以来的偏移量,需+1900 local_tm->tm_hour, local_tm->tm_min, local_tm->tm_sec, tv.tv_usec); return 0; }
问题2:无需数组存储时间tick数,直接格式化为指定格式?
当然可以!你原来的代码用char buffer[30]暂存格式化结果,其实完全可以跳过这个缓冲区,直接将时间输出到目标流(比如标准输出),从而节省这部分内存。
核心思路是直接解析tm结构体的各个字段,用printf直接输出,不需要额外的数组来中转。优化后的代码如下:
#include <stdio.h> #include <sys/time.h> #include <time.h> int main() { struct timeval tv; struct tm local_tm_struct; struct tm *local_tm; gettimeofday(&tv, NULL); // 多线程环境建议用localtime_r避免竞态问题 local_tm = localtime_r(&tv.tv_sec, &local_tm_struct); // 直接输出指定格式"%m-%d-%Y %T",加上微秒,无需额外数组 printf("%02d-%02d-%04d %02d:%02d:%02d.%ld\n", local_tm->tm_mon + 1, local_tm->tm_mday, local_tm->tm_year + 1900, local_tm->tm_hour, local_tm->tm_min, local_tm->tm_sec, tv.tv_usec); return 0; }
内存节省的原理
原来的代码需要分配30字节的数组来暂存strftime的结果,现在直接通过printf把各个时间字段输出到目标流,完全不需要额外的内存缓冲区。对于内存受限的场景(比如嵌入式设备),这种方式会更高效。
内容的提问来源于stack exchange,提问作者Praffulla Pandey
相关产品推荐
相关产品推荐

