01
项目介绍
一个随机抽取名单文件中的名字的c++小程序。
02
代码
刚开始 的想法是用一个二维字符数组来储存名单中 的名字。
char name[NAME_NUM][NAME_LEN];
NAME_NUM:名字最大数目,我就不弄动态的了,固定为50;
NAME_LEN:名字长度,按五个汉字算,为10;
声明随机变量和计数变量:
int rndIndex,i=0;
接着是用文件流打开并读取:
ifstream fin;
fin.open("nameList.txt");
if(fin.fail())
return 0;
while(!fin.eof())
{
fin.getline(name[i],NAME_LEN);
i++;
}
抽取名字:
do
{
rndIndex=rand()%i;
cout
cin>>command;
}while(command != '0');
最后关闭文件:
fin.close();
名单文件里面是这样的:
编译通过,但是段错误了,去查了一下,发现是因为非法访问内存了。错误语句是 fin.getline(name[i],NAME_LEN);
我也不明白咋回事,把它改成fin>>name[i];就ok了。
是可以运行,不过又出现了一个问题:
乱码了。说明输出了name数组未赋值的行。那也许是rndIndex的问题?
于是把这个语句改了一下:
cout
一个个地尝试,齐木楠雄和照桥心美都没问题,尝试到八一老爷的时候……
歪,妖妖灵吗?对,还是那个人,不过换了个地方
好吧不开玩笑了,其实应该是龙王的名字太长而越界了,来试试把NAME_LEN改成20;
就可以 正常运行了:
接着改成11,也可以正常运行。突然想起来,字符串末尾的'\0'也是需要一个位置的,这就难怪了。
03
收获
字符串末尾需要一个'\0'的位置,记得留出来;
二维数组声明时用花括号赋值,没有赋值到的元素变为空字符串;
段错误主要是因为访问非法内存;
测试时候不要让八一老爷来
领取专属 10元无门槛券
私享最新 技术干货