gpt4 book ai didi

c - asctime() 奇怪的行为

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:54 26 4
gpt4 key购买 nike



我有以下代码。

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

int main(int argc, char** argv) {
time_t t1, t2;
time(&t1);/* set current time to t1 */

struct tm T1, T2;
int i;
scanf("%d", &i); /* for delaying */
time(&t2); /* set current time to t2 */

T1 = *(struct tm*)localtime(&t1);
T2 = *(struct tm*)localtime(&t2);

printf("%s%s", asctime(&T1), asctime(&T2)); /* display them */
}

基本上,我想获取 t1 上的当前时间,然后(在等待读取 i 导致的延迟之后)t2 上的当前时间。 t1 和 t2 不同,T1.tm_sec 和 T2.tm_sec 也不同,但 printf 显示完全相同的日期(对应于 T1 的日期)。我知道在内部,asctime( http://www.cplusplus.com/reference/ctime/asctime/?kw=asctime) 使用静态指针,但我尝试了一个较小的示例程序,其中包含一个返回静态字符指针的函数并且它们工作正常。

char* test(int t) {
static char result[10];
sprintf(result, "%d", t);

return result;
}

然后我像这样使用它

printf("%s ", test(5));
printf("%s ", test(7));

并且有效(打印的字符串不同)。

所以我猜它不可能来自那里。我还复制了 asctime 代码(来自 cplusplus)并将一些 printfs 放入函数中,我注意到结果变量在 sprintf 语句后得到正确更新。

那么 printf 显示相同的日期会发生什么?

来自cplusplus.com的asctime代码

char* asctime(const struct tm *timeptr)
{
static const char wday_name[][4] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
static const char mon_name[][4] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
static char result[26];
sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
wday_name[timeptr->tm_wday],
mon_name[timeptr->tm_mon],
timeptr->tm_mday, timeptr->tm_hour,
timeptr->tm_min, timeptr->tm_sec,
1900 + timeptr->tm_year);
return result;
}

最佳答案

区别在于:

printf("%s%s", asctime(&T1), asctime(&T2));

printf("%s ", test(5));
printf("%s ", test(7));

第一个(也会导致您定义为“奇怪”的行为)使用静态内存位置来存储字符串。第二次调用覆盖第一次调用的结果。

在您的第二个示例中,您实际上使用了第一次调用的结果,然后第二次调用该函数。为了保存这两个结果,您可以执行以下操作:

printf("%s%s", strdup(asctime(&T1)), strdup(asctime(&T2)));

这将分配一个副本并将结果存储在那里。更好的是这样的:

char *result1 = strdup(asctime(&T1)), *result2 = strdup(asctime(&T2));

printf("%s%s", result1, result2);

free(result1);
free(result2);

关于c - asctime() 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com