为什么当我尝试显示具有不同参数的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;
}
答案 0 :(得分:5)
两次拨打localtime
或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;
}
答案 1 :(得分:4)
返回的值指向一个内部对象,其有效性或值可能会被随后的gmtime或localtime调用更改。
localtime()
返回两次相同的指针:你在同一个数据上工作两次。
测试:
printf("%p\n", localtime(&time1));
printf("%p\n", localtime(&time2));
输出:
0x7f7d9d2eee80
0x7f7d9d2eee80
答案 2 :(得分: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;
}
请注意vàriablestimeinfo?
和time?str
的不同声明。
答案 3 :(得分: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);