调试手记

 本来在做PC机MFC的程序,调试的一点问题没有之后再移植到装有WINCE5.0的SKY2440的开发板上的,但是程序写完之后发现有很多莫名其妙的问题。今天决定先做基本的Win32控制台程序,调试的没问题之后再进一步做有友好界面的MFC程序,最后再移植。

      关于strcpy()函数,说存在安全争议,于是我用strcpy_s()复制字符串。后者的第二个参数必须比实际字符串长度大1,即增加一个放结束符“\0”的位置。否则调试,当运行到这一函数时,程序会崩溃。下面是我的代码:

  size_t n=(*iter).size()+1;
  char* p=new char[n];
  strcpy_s(p,n,(*iter).c_str());
  strcpy_s(sceBuf[i].sceneryName,n,p);

这一段代码实现的功能是将Vector里面的字符串传换为字符数组,注意要开辟新的字符空间,不要用原来字符数组的指针,这样容易造成野指针问题。

        虽然这个问题看起来很幼稚,但是当你写程序时,不小心犯了很幼稚的问题,你会格外珍惜的,至少我是这样。

这一段出自

getStoredPosition::getStoredPosition(void)
{

 sceneryBuffer sceBuf[SCESIZE];
    double doub;
 int i=0;
    vector <string> vec;
 vector <string>::iterator iter;
 char ival[40];
 ifstream inFile("storedData.txt");
 if(!inFile.is_open()){
  exit(-1);
 }
 else
 {
  while(inFile.getline(ival,50)){
   vec.push_back(ival);
  }

 }
 for(iter=vec.begin();iter!=vec.end();){
  size_t n=(*iter).size()+1;
  char* p=new char[n];
  strcpy_s(p,n,(*iter).c_str());
  strcpy_s(sceBuf[i].sceneryName,n,p);
  ++iter;
   doub=atof((*iter).c_str());
  sceBuf[i].wLon=doub;
  ++iter;
  doub=atof((*iter).c_str());
  sceBuf[i].eLon=doub;
  ++iter;
  doub=atof((*iter).c_str());
  sceBuf[i].nLat=doub;
  ++iter;
  doub=atof((*iter).c_str());
  sceBuf[i].sLat=doub;
  ++iter;
  i++;
 }
}

这段程序是getStoredPosition类的,这个类主要实现的是将存储好的景点信息借助Vector读到一个Struct里,但是在将string类型数据转换为double时用的一个库函数atof(),但是当最后一位小数小于等于5时(我还没验证5)转换的数据准确,当最后一位小数大于5是就出问题,比如本来是121.2346转换之后就成为121。2346999999..。这是一个很大的问题,过后解决。

原文地址:https://www.cnblogs.com/buffer/p/1279018.html