这是我的代码:
time_t tim=time(NULL); // acquire time information
struct tm * now=localtime(&tim);
char cyear[3], cmonth[2], cday[2], chour[2], cmin[2];
int test = 13;
sprintf(cyear, "%d", test);
sprintf(cmonth, "%d", now->tm_mon+1);
sprintf(cday, "%d", now->tm_mday);
sprintf(chour, "%d", now->tm_hour);
sprintf(cmin, "%d", now->tm_min);
printf("cyear is: %s\n",cyear);
printf("cmin is: %s\n",cmin);
我得到的输出是:
cyear is:
cmin is: 7
输出也不适用于cmonth或cday,但chour和cmin似乎给出了正确的输出。这是怎么回事?
答案 0 :(得分:10)
cmonth
版本如果是10月,11月或12月将导致缓冲区溢出。 cday
将缓冲溢出,如果它是该月的10号或更晚,chour
将溢出,如果它已经超过10点。并且cmin
将溢出,如果它是10分钟小时。
所以你的代码在1970年1月1日00:00很好,但不是很多!
要解决此问题,请将缓冲区放大;并使用snprintf
函数。如果字段不包含您的预期,那将保证您不会出现缓冲区溢出。例如:
char chour[6];
snprintf(chour, sizeof chour, "%d", now->tm_hour);