调试手记
关于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..。这是一个很大的问题,过后解决。