2

为什么当我尝试显示 2 个具有不同参数的日期时,我将其放入 localtime() 函数中,控制台显示 2 个相等的日期?

这是我的代码:

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

int main() {
    time_t time1, time2;
    struct tm *timeinfo1, *timeinfo2;
    char *time1str, *time2str;

    time1 = 3600;
    time2 = 3720;
    timeinfo1 = localtime(&time1);
    timeinfo2 = localtime(&time2);

    time1str = asctime(timeinfo1);
    time2str = asctime(timeinfo2);
    puts(time1str);
    puts(time2str);

    getch();
    return 0;
}
4

4 回答 4

5

数据不会在两次调用localtimeor之间持续存在asctime。您必须在某处复制数据。这是更正的示例(strncpy 仍然没有什么问题):

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

int main() {
    time_t time1, time2;
    struct tm timeinfo1, timeinfo2, *ti;
    char time1str[256], time2str[256], *tstr;

    time1 = 3600;
    time2 = 3720;
    ti = localtime(&time1);
    memcpy(&timeinfo1, ti, sizeof(*ti));
    ti = localtime(&time2);
    memcpy(&timeinfo2, ti, sizeof(*ti));

    tstr = asctime(&timeinfo1);
    strncpy(time1str, tstr, sizeof(time1str) - 1);
    tstr = asctime(&timeinfo2);
    strncpy(time2str, tstr, sizeof(time1str) - 1);

    puts(time1str);
    puts(time2str);

    return 0;
}
于 2013-10-17T09:20:21.473 回答
4

来自本地时间的文档

返回的值指向一个内部对象,其有效性或值可能会被任何后续调用 gmtime 或 localtime 更改。

localtime()返回两次相同的指针:您正在处理相同的数据两次。

测试:

printf("%p\n", localtime(&time1));
printf("%p\n", localtime(&time2));

输出 :

0x7f7d9d2eee80
0x7f7d9d2eee80
于 2013-10-17T09:15:55.430 回答
2

localtime()每个都asctime()返回一个指向内部缓冲区的指针。每次localtime()asctime()调用此缓冲区都会被覆盖,因此在 OP 的代码中,第一次调用的结果被第二次调用的结果替换。

要打印不同的时间,只需重新排列调用的顺序,如下所示:

timeinfo1 = localtime(&time1);
time1str = asctime(timeinfo1);
puts(time1str);

timeinfo2 = localtime(&time2);
time2str = asctime(timeinfo2);
puts(time2str);

或者,如果使用符合 POSIX 的系统使用localtime_r()并且asctime_r()使用调用者提供的缓冲区:

#define _POSIX_C_SOURCE 1

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

int main(void) 
{
  time_t time1 = 3600;
  time_t time2 = 3720;

  struct tm timeinfo1 = {0};      
  struct tm timeinfo2 = {0};

  char time1str[32] = "";
  char time2str[32] = "";

  localtime_r(&time1, &timeinfo1);
  localtime_r(&time2, &timeinfo2);

  asctime_r(&timeinfo1, timestr1);
  asctime_r(&timeinfo2, timestr2);

  puts(time1str);
  puts(time2str);

  getch();

  return 0;
}

timeinfo?请注意变量和的不同声明time?str

于 2013-10-17T11:19:13.187 回答
0

为什么...控制台显示 2 个相等的日期?

localtime()gmtime()返回一个指向共享struct tm内存位置的指针。

就像@keltar的好答案一样,为了保留struct tm信息,代码应该struct tm在后续localtime(), gmtime()调用之前复制它。

而不是mempcy()一个简单的分配=就可以了。

// struct tm *timeinfo1, *timeinfo2;  // Not pointers
struct tm timeinfo1, timeinfo2;       // ... but structures. 

time1 = 3600;
time2 = 3720;
// timeinfo1 = localtime(&time1);  // Rather than copy the pointer
// timeinfo2 = localtime(&time2);
//          v--------------------- // Notice the *
timeinfo1 = *localtime(&time1);    // Copy the structure
timeinfo2 = *localtime(&time2);
于 2018-01-08T05:44:54.710 回答