Chinaunix首页 | 论坛 | 博客
  • 博客访问: 548286
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:26:38

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
阅读(303) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~