为什么sprintf在一个例子而不是下一个例子中工作?

时间:2014-11-03 01:10:38

标签: c string integer printf output

这是我的代码:

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似乎给出了正确的输出。这是怎么回事?

1 个答案:

答案 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);