[英]asctime() weird behaviour
我有以下代码。
#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指针的函数的较小示例程序,工作了。
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;
}
问题在于,使用test
功能的test
检查了除使用asctime
以外的其他情况。 有test
:
printf("%s ", test(5));
printf("%s ", test(7));
您有两个单独的函数调用,而使用asctime
有
printf("%s%s", asctime(&T1), asctime(&T2)); /* display them */
在一个函数中将两个调用作为参数。 在调用之前的参数进行评估printf
函数,这样的错误行为asctime
可见-在调用的一个asctime
会覆盖另一个的结果。 将asctime
的结果复制到某个地方,然后再次调用它,最好使用asctime_r
。
有一个区别:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.