程序溢出,可是问题在哪呢?

dulvtianya 2008-09-09 02:22:05

//一个提取国家三级地名的小程序,从个txt文档中提取的。问题处在二维字符串数组那,请高手看看,
CWTProfile m_ini;
m_ini.Load("E:\\ChinaCities.ini");

char * pFileName="E:\\ChinaCities.txt";
CStdioFile myFile;
myFile.Open(pFileName,CFile::modeReadWrite);
CString str,strNum,strValue;
CStringArray strProvinceArray;
CStringArray *subString;
CArray <CStringArray *,CStringArray* > strCity2Array;
//CStringArray strCityArray;

int nNum[3]={0,0,0},index,at1,at2,tag,i,ProvinceId=0;
for(myFile.ReadString(str);str.IsEmpty()!=1;myFile.ReadString(str))
{

nNum[0]=0;
nNum[1]=99;
nNum[2]=99;
for(index=0,i=0,tag=0;;index++)
{
strNum=str.Mid(index,1);
if(strNum>='0'&& strNum<='9')
{
if(tag==1)
{
i--;
nNum[i]=nNum[i]*10+atoi(strNum);
}
nNum[i]=atoi(strNum);
int tempra=nNum[i];
i++;
tag=1;
}
else if (strNum=="_") tag=0;
else
{
strValue=str.Mid(index,str.GetLength()+1-index);
break;
}
}
if(nNum[1]==99&&nNum[2]==99)//省级地名
{
CString strTempra;
str=","+strValue;
for(at1=0,at2=0;;)
{
index=strProvinceArray.Add(new char[50]);
at1=str.Find(",",at1);
at2=str.Find(",",at1+1);
if(at2<=0)
{
strProvinceArray[index]=str.Mid(at1+1,str.GetLength());
strTempra=strProvinceArray[index];
break;
}
strProvinceArray[index]=str.Mid(at1+1,at2-at1-1);
CString strTempra=strProvinceArray[index];
index++;
at1=at2;
}
}
else if(nNum[1]<99&&nNum[2]==99)//市级地名
{

int ttt=strCity2Array.Add(subString);
subString=new CStringArray;
str=","+strValue;
for(at1=0,at2=0;;)
{
//index=subString->Add(new char[30]);
at1=str.Find(",",at1);
at2=str.Find(",",at1+1);
if(at2<=0)
{
//subString->SetAt(index,str.Mid(at1+1,str.GetLength()));
int sss=subString->Add(str.Mid(at1+1,str.GetLength()));
break;
}
//subString->SetAt(index,str.Mid(at1+1,at2-at1-1));
int hhh=subString->Add(str.Mid(at1+1,at2-at1-1));
at1=at2;
}

}
else if(nNum[1]<99&&nNum[2]<99)//县级地名
{
int iss=nNum[1];
int issp=nNum[2];
CString strPro=strProvinceArray[nNum[1]];
CString strCit=((CStringArray *)strCity2Array.GetAt(nNum[1]))->GetAt(nNum[2]);//程序运行这个地方溢出
m_ini.SetText(strPro,strCit,strValue);
m_ini.Save("E://ChinaCities.ini");

}
}
}

//---附部分城市代码
0安徽,北京,福建,甘肃,广东,广西,贵州,海南,河北,河南,黑龙江,湖北,湖南,吉林,江苏,江西,辽宁,内蒙古,宁夏,青海,山东,山西,陕西,上海,四川,天津,西藏,新疆,云南,浙江,重庆
0_0安庆,蚌埠,巢湖,池州,滁州,阜阳,合肥,淮北,淮南,黄山,六安,马鞍山,宿州,铜陵,芜湖,宣城,亳州
0_0_0安庆市,怀宁县,潜山县,宿松县,太湖县,桐城市,望江县,岳西县,枞阳县
0_0_1蚌埠市,固镇县,怀远县,五河县
0_0_2巢湖市,含山县,和县,庐江县,无为县
0_0_3池州市,东至县,青阳县,石台县
0_0_4滁州市,定远县,凤阳县,来安县,明光市,全椒县,天长市
0_0_5阜南县,阜阳市,界首市,临泉县,太和县,颖上县
0_0_6长丰县,肥东县,肥西县
0_0_7淮北市,濉溪县
0_0_8凤台县,淮南市
0_0_9黄山市,祁门县,休宁县,歙县,黟县
0_0_10霍邱县,霍山县,金寨县,六安市,寿县,舒城县
0_0_11当涂县,马鞍山市
0_0_12灵璧县,宿州市,萧县,泗县,砀山县
0_0_13铜陵市,铜陵县
0_0_14繁昌县,南陵县,芜湖市,芜湖县
0_0_15广德县,绩溪县,郎溪县,宁国市,宣城市,泾县,旌德县
0_0_16利辛县,蒙城县,涡阳县,亳州市
0_1北京
0_1_0北京市,密云县,延庆县
0_2福州,龙岩,南平,宁德,莆田,泉州,三明,厦门,漳州
0_2_0长乐市,福清市,福州市,连江县,罗源县,闽侯县,闽清县,平潭县,永泰县
0_2_1长汀县,连城县,龙岩市,上杭县,武平县,永定县,漳平市
0_2_2光泽县,建阳市,建瓯市,南平市,浦城县,邵武市,顺昌县,松溪县,武夷山市,政和县
0_2_3福安市,福鼎市,古田县,宁德市,屏南县,寿宁县,霞浦县,周宁县,柘荣县
0_2_4莆田市,仙游县
0_2_5安溪县,德化县,惠安县,金门县,晋江市,南安市,泉州市,石狮市,永春县
0_2_6大田县,建宁县,将乐县,明溪县,宁化县,清流县,三明市,沙县,泰宁县,永安市,尤溪县
0_2_7厦门市
0_2_8长泰县,东山县,华安县,龙海市,南靖县,平和县,云霄县,漳浦县,漳州市,诏安县
0_3白银,定西,甘南藏族自治州,嘉峪关,金昌,酒泉,兰州,临夏回族自治州,陇南,平凉,庆阳,天水,武威,张掖
0_3_0白银市,会宁县,景泰县,靖远县
0_3_1定西县,临洮县,陇西县,通渭县,渭源县,漳县,岷县
0_3_2迭部县,合作市,临潭县,碌曲县,玛曲县,夏河县,舟曲县,卓尼县
0_3_3嘉峪关市
0_3_4金昌市,永昌县
0_3_5阿克塞哈萨克族自治县,安西县,敦煌市,金塔县,酒泉市,肃北蒙古族自治县,玉门市
0_3_6皋兰县,兰州市,永登县,榆中县
0_3_7东乡族自治县,广河县,和政县,积石山保安族东乡族撒拉族自治县,康乐县,临夏市,临夏县,永靖县
0_3_8成县,徽县,康县,礼县,两当县,文县,武都县,西和县,宕昌县
0_3_9崇信县,华亭县,静宁县,灵台县,平凉市,庄浪县,泾川县
0_3_10合水县,华池县,环县,宁县,庆城县,庆阳市,镇原县,正宁县
0_3_11甘谷县,秦安县,清水县,天水市,武山县,张家川回族自治县
0_3_12古浪县,民勤县,天祝藏族自治县,武威市
0_3_13高台县,临泽县,民乐县,山丹县,肃南裕固族自治县,张掖市
...全文
131 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
flymoon99 2008-09-10
  • 打赏
  • 举报
回复
CString strCit=((CStringArray *)strCity2Array.GetAt(nNum[1]))->GetAt(nNum[2]);//程序运行这个地方溢出
使用之前先判断下指针是否为空,再进行操作。
season030441 2008-09-09
  • 打赏
  • 举报
回复
单步调一下看看你的程序在发生异常时,是一次都没有进行呢还是可以循环几次,如果一次都没与循环那么还是应该看看,你对CArry的使用,可以先不在这样的大程序上进行,干扰因素太多,不容易发现问题根源。
dulvtianya 2008-09-09
  • 打赏
  • 举报
回复
问题是,我定义个二维数组
CStringArray *subString;
CArray <CStringArray *,CStringArray* > strCity2Array;
来放2级城市名,因为一个省的2级城市名有若干,
从第一个省开始;
int ttt=strCity2Array.Add(subString);
subString=new CStringArray;
然后开始增加字符串,
int hhh=subString->Add(str.Mid(at1+1,at2-at1-1));
我觉得第一个字符串是保存在【0】【0】里吧,我是这样取值的,(仿照网上例子)
CString strCit=((CStringArray *)strCity2Array.GetAt(nNum[1]))->GetAt(nNum[2]);
但是,我在调试观察时,第一次循环到着就溢出错误了,为什么呢?是不是二维数组不是这样用的?谁能给个具体例子啊?
qqwx_1986 2008-09-09
  • 打赏
  • 举报
回复
没看到二维数组在哪啊
VsirSoft 2008-09-09
  • 打赏
  • 举报
回复
好长。。。。没信心看了 最要的是你说问题处在二位数组。。是什么问题都没有讲。。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧