0

抱歉我的第 10 亿个问题,但我无法弄清楚我的实施需要什么。

我有一个名为 fmttimetest.cc(包含 main)的测试文件,它是包含 fmttime.h 和 fmttime.cc(实现文件)的模块的一部分

在 fmttime.cc 我有这个功能

 28 ExpandedTime* localTime(struct timeval* tv, ExpandedTime* etime)
 29 {
 30     tzset();                                    // Corrects timezone
 31
 32     int epochT = (tv->tv_sec) - timezone;       // Epoch seconds with
 33     int epochUT = tv->tv_usec;                  // Timezone correction
 34
 35     int seconds = epochT % 60;
 36     epochT /= 60;
 37     etime->et_sec = seconds;
 38     etime->et_usec = epochUT;
 39
 40     int minutes = epochT % 60;
 41     epochT /= 60;
 42     etime->et_min = minutes;
 43
 44     int hours = (epochT % 24) + daylight;       // Hours with DST correction
 45     epochT /= 24;
 46     etime->et_hour = hours;
 47
 48
 49     printf("%d,%d,%d\n", seconds, minutes, hours);
 50     printf("%d\n", epochUT);
 51     printf("%d\n", timezone);
 52     printf("%d\n", daylight);
 53     return etime;
 54
 55 }
 56
 57 char* formatTime(struct timeval* tv, char* buf, size_t len)
 58 {
 59
 60 struct ExpandedTime etime2;
 61 localTime(tv, &etime2);
 62 snprintf();
 63 }

*注意包含结构扩展时间的最上面的代码行是截止的,但我向您保证它们已正确实施

现在在我的主测试文件 fmttimetest.cc 中,我调用了 formatTime 函数。但是我对缓冲区和 size_t len 应该如何交互感到困惑。我在一定程度上知道 size_t len 是什么……可以说它给你一个对象的大小。所以在我的主要 test.cc 我有这个

  6 #include <curses.h>
  7 #include <sys/time.h>
  8 #include <time.h>
  9 #include "fmttime.h"
 10
 11 struct timeval tv;
 12
 13 int main()
 14 {
 15 char buf[] = {"%d"};
 16 size_t len;
 17 gettimeofday(&tv, NULL);
 18 formatTime(&tv, buf, len);
 19 }

所以这就是我感到困惑的地方。我需要传递此缓冲区,以便我的实现程序可以将纪元时间以人类可读格式写入此缓冲区,例如日、小时、分钟、秒。我不知道该怎么做。我无法更改它们按原样提供的任何函数原型,并且预计将按原样使用......

我也不确定如何在使用 snprintf() 将时间打印到传递的缓冲区的上下文中使用它....

再次感谢阅读本文的人。

4

2 回答 2

1

调用 formatTime 的正确方法是:

int main()
{
    char buf[64];
    size_t len = sizeof(buf);
    gettimeofday(&tv, NULL);
    formatTime(&tv, buf, len);
}

所以你传入缓冲区及其长度。然后由 formatTime 写入缓冲区内容。

编辑:缓冲区当然需要有一些足够的长度:)

要将 snprintf 与您的时间结构一起使用,您可以执行以下操作(未经测试):

snprintf(buf, len, "%02i:%02i:%02i", etime2.et_hour, etime2.et_min, etime2.et_sec);
于 2013-03-14T06:10:49.453 回答
0

缓冲区,是一个字符数组。在您的情况下,它代表一个字符串。c 中的字符串定义为以 '\0' 结尾的字符数组。缓冲区的大小是字符串的长度 + '\0' 符号。

让我们进一步检查一下:

char buf[] = {"%d"};
size_t len;
len = strlen(buf); // strlen returns the length without the zero terminating char.
len = sizeof(buf); // Because buf is preallocated in compilation, you can get it's length, this includes the zero at the end.
于 2013-03-14T06:01:31.163 回答