前几天编写了个时间转换的函数,但是运行一直出问题。
在VC的编译器上,出现内存访问错误的严重警告
在GCC的编译器上,提示“空间不足”
代码如下:
#include <string.h>
#include <math.h>
#include <time.h>
int main()
{
time_t tm_start,tm_end;
char astr_start[] = "2008-08-08 08:08:00/n";
char astr_end[] = "2008-08-08 08:08:00/n";
time(&tm_start);
TimeChange( ctime(&tm_start), astr_start );
printf("%s/n",astr_start);
................
time(&tm_end);
TimeChange( ctime(&tm_end), astr_end );
printf("%s/n",astr_end);
return 0;
}
/************************************************************************/
/* Change time type:"Fri Apr 29 12:25:12 1994" -> "1994-04-29 12:25:12" */
/************************************************************************/
int TimeChange( char* pchTimeBefore, char achTimeAfter[] )
{
char achYear[4] = "1994";
char achMonth[3] = "Apr";
char achDay[2] = "29";
char achHour[2] = "12";
char achMinute[2] = "25";
char achSecond[2] = "12";
char achWeek[3] = "Fri";
int i = 0;
char achTimeAfterTemp[21];
if( NULL == pchTimeBefore || NULL == achTimeAfter )
{
printf("time is NULL!/n");
return -1;
}
strcopy(achYear, pchTimeBefore, 20, 4);
strcopy(achMonth, pchTimeBefore, 4, 3);
strcopy(achDay, pchTimeBefore, 8, 2);
strcopy(achHour, pchTimeBefore, 11, 2);
strcopy(achMinute, pchTimeBefore, 14, 2);
strcopy(achSecond, pchTimeBefore, 17, 2);
strcopy(achWeek, pchTimeBefore, 0, 3);
if( 0 == strcmp("Jan",achMonth) )
{
memcpy(achMonth,"01",2);
}
else if( 0 == strcmp("Feb",achMonth) )
{
memcpy(achMonth,"02",2);
}
else if( 0 == strcmp("Mar",achMonth) )
{
memcpy(achMonth,"03",2);
}
else if( 0 == strcmp("Apr",achMonth) )
{
memcpy(achMonth,"04",2);
}
else if( 0 == strcmp("May",achMonth) )
{
memcpy(achMonth,"05",2);
}
else if( 0 == strcmp("Jun",achMonth) )
{
memcpy(achMonth,"06",2);
}
else if( 0 == strcmp("Jul",achMonth) )
{
memcpy(achMonth,"07",2);
}
else if( 0 == strcmp("Aug",achMonth) )
{
memcpy(achMonth,"08",2);
}
else if( 0 == strcmp("Sep",achMonth) )
{
memcpy(achMonth,"09",2);
}
else if( 0 == strcmp("Oct",achMonth) )
{
memcpy(achMonth,"10",2);
}
else if( 0 == strcmp("Nov",achMonth) )
{
memcpy(achMonth,"11",2);
}
else if( 0 == strcmp("Dec",achMonth) )
{
memcpy(achMonth,"12",2);
}
else
{
return -1;
}
achMonth[2] = '/0';
strcpy(achTimeAfterTemp, achYear );
strcat(achTimeAfterTemp, "-");
strcat(achTimeAfterTemp,achMonth);
strcat(achTimeAfterTemp, "-");
strcat(achTimeAfterTemp, achDay);
strcat(achTimeAfterTemp, " ");
strcat(achTimeAfterTemp, achHour);
strcat(achTimeAfterTemp, ":");
strcat(achTimeAfterTemp, achMinute);
strcat(achTimeAfterTemp, ":");
strcat(achTimeAfterTemp, achSecond);
strcat(achTimeAfterTemp, "/n");
memcpy(achTimeAfter,achTimeAfterTemp,strlen(achTimeAfterTemp));
achTimeAfter[strlen(achTimeAfterTemp)] = '/0';
return 0;
}
int strcopy( char *pDes, char *pSrc, unsigned int pos, unsigned int chlen )
{
int i = 0;
int len = strlen(pSrc);
int lenD = strlen(pDes);
if( NULL == pSrc || NULL == pDes )
{
printf("string is NULL!/n");
return -1;
}
len = strlen(pSrc);
if( len < chlen )
{
printf("chlen(%d) is too big : len(%d)!/n",chlen,len);
return -1;
}
lenD = strlen(pDes);
if( chlen > lenD )
{
printf("chlen(%d) is too small : lenD(%d)!/n",chlen,lenD);
return -1;
}
if( 0 > pos || pos >= len )
{
printf("pos(%d) is wrong : len(%d)!/n",pos,len);
return -1;
}
i = pos;
while( i < pos + chlen )
{
*(pDes + i - pos) = *(pSrc + i);
i++;
}
*(pDes + chlen) = '/0';
return 0;
}
最后再次审查代码,发现是数组分配空间时,没有考虑到'/0',因而发生了内存溢出。
修正:数组长度+1
结果:VC编译器和GCC编译器均正常通过。