1 现象:问题描述
在XXX版本中处理话单时出现话单重复现象,跟踪后发现当话单文件结尾处有空行时候话单就会重复,如果话单文件中只有一条记录,而文件中有9个空行,处理后的话单文件里面却变成10条一模一样的话单记录;查看代码后才发现是由一个不起眼的错误引起的。
2 关键过程:根本原因分析
程序中处理话单是将话单文件里面的记录读入内存中进行处理的,所以程序代码如下:
char szEvent[MAX_EVENTLENGTH+4],szLastEvent[MAX_EVENTLENGTH+4];//作为行缓冲区
while(循环文件中的每一行)
{
File.ReadLine(szEvent);//从话单文件中读取一行
………;//对szEvent数据做相应的处理;
strcpy(szLastEvent,szEvent);
resetEventId(szLastEvent);//将szLastEvent的前三个元素加上一系统参数值;
ChargingEvent->addEvent(szLastEvent,0);//将szLastEvent加入到内存对象中
}
Int resetEventId(char *pData)
{
char buf[32];
sprintf(buf,"%d",nHDEventID);// nHDEventID为系统参数,一般是3位
memcpy(pData,buf,strlen(buf));
return 1;
}
程序首先从话单文件中读入一行存放在缓存区里面,经过处理后将该缓存区的数据拷贝到另一缓存区进行处理,最终加入到内存对象,初看这段代码发现没什么问题,但是当文件中第一行是一条正确的话单记录,后续有若干条空行记录时候就出现了问题,原因如下:当读取第一行记录时候,由于记录正确读入到szEvent处理后,又拷贝到szLastEvent中,但是当处理到第2行时候,szEvent中的内容就变成空行了,使用strcpy(szLastEvent,szEvent)后szLastEvent[0]='\0',但是szLastEvent后面从第2个元素开始的值都保留的是上一条记录szEvent的值,使用resetEventId函数后,szLastEvent的前3个元素值被更新了,但是后面的所有元素的值仍然是上一条话单记录的值,导致最后处理完后出现10条一模一样的话单记录;
分析其原因,很简单,使用strcpy(char *dest,const char *src)时候只负责将src里面的值拷贝到dest里面,如果dest里面原来有值,且src中的内容长度小于dest的长度,dest里面原有的数据是会保留其中的,如下代码模拟这一过程:
#include
#include
void main()
{
char szEvent[10],szLastEvent[10];
strcpy(szEvent,"123456789");
strcpy(szLastEvent,szEvent);
szEvent[0]='\0';
strcpy(szLastEvent,szEvent);
memcpy(szLastEvent,"123",3);
cout<<"test:"<}
szLastEvent最后显示出来的值并非123,而是123456789。
3 结论:解决方案及效果
解决方案有两种:
1、 在strcpy(szLastEvent,szEvent)前增加一个memset(szLastEvent,0,MAX_EVENTLENGTH+4)将szLastEvent原有的数据清空;程序处理正确;
2、 在resetEventId函数中增加判断:如果pData的长度小于等于3,那么在memcpy(pData,buf,strlen(buf))之后加一行pData[strlen(buf)]='\0'。
4 经验总结:预防措施和规范建议
使用各种数组时候一定要注意,在使用前清空里面原有的残留数据。
5 备注
6 考核点
数组残留数据清空。
7 试题
执行如下语句后,输出的结果为:(D)
注意:以下程序片断为描述方便,不一定符合编程规范。
void main()
{
char src[10],dest[10];
strcpy(src,"123456789");
strcpy(dest,src);
src[0]='\0';
strcpy(dest,src);
memcpy(dest,"123",3);
cout<<"test1:"< memset(dest,0,10);
strcpy(dest,src);
memcpy(dest,"123",3);
cout<<"test2:"<}
A) test1:123
test2:123
B) test1:123
test2:123456789
C)test1:123456789
test2:123456789
D)test1:123456789
test2:123
阅读(322) | 评论(0) | 转发(0) |