#include
#include
#include
#include
using namespace std;
struct stu
{
string name;
int score;
};
listvk;
void makemenu()
{
cout<<"---------学生成绩管理----------"<"1.录入功能"<"2.插入功能"<"3.浏览功能"<"4.删除功能"<"5.修改功能"<"6.查询功能"<"7.退出系统"<"-----------------------------------"<while(scanf("%d", &input) != 1)
{
while((ch = getchar())!= '\n')
putchar(ch);
cout<<"输入错误,请重新输入"<return input;}
void keydown()
{long m;
struct stu b;
struct stu a;
list::iterator it=vk.begin();
list::iterator it1=vk.begin();
string nname;
string n1name;
int score;
m=get_long();
switch(m)
{
case 1:cout<<"----【录入模块】----"<;
cout<<"请输入想录入的学生姓名和成绩。"<>b.name>>b.score;
vk.push_back(b);
break;
case 2:cout<<"----【插入模块】----"<;
cout<<"请输入想在谁的前面插入"<>nname;
for(it1=vk.begin();(*it1).name!=nname&&it1!=vk.end();it1++);
if((*it1).name==nname)
{cout<<"请输入想要插入的学生和成绩!"<>a.name>>a.score;
vk.insert(it1,a);
}
break;
case 3:cout<<"----【浏览模块】----"<;
for(;it!=vk.end();it++)
{
cout<<(*it).name<<' '<<(*it).score<break ;
case 4:cout<<"----【删除模块】----"<;
cout<<"请输入想删除的学生姓名。"<>nname;
for(it1=vk.begin();(*it1).name!=nname&&it1!=vk.end();it1++);
if((*it1).name==nname)
{
vk.erase(it1);
}
if(it1==vk.end())
{
cout<<"想要删除的对象不存在"<break ;
case 5:cout<<"----【修改模块】----"<;
cout<<"请输入想修改的学生姓名。"<>nname;
for(it1=vk.begin();(*it1).name!=nname&&it1!=vk.end();it1++);
if((*it1).name==nname)
{cout<<"请输入新同学的学生姓名和成绩。"<>n1name>>score;
(*it1).name=n1name;
(*it1).score=score;
}
if(it1==vk.end())
{
cout<<"想要改变的对象不存在"<break ;
case 6:cout<<"----【查询模块】----"<;
cout<<"请输入想查询的学生姓名。"<>nname;
for(it1=vk.begin();(*it1).name!=nname&&it1!=vk.end();it1++);
if((*it1).name==nname)
{cout<<(*it1).name<<' '<<(*it1).score<if (it1==vk.end())
{
cout<<"想要查询的对象不存在"<break ;
case 7:cout<<"----【退出系统】----"<;
exit(0);
break;
}
}
int main()
{
while(1)
{
makemenu();
keydown();
system("pause");
system("cls");
}
return 0;
}
越界访问了,当it1==vk.end()时,“(*it1).name==nname”访问了vk.end()。
应该用if-else排除,示例:
case 5:
cout << "----【修改模块】----" << endl;
cout << "请输入想修改的学生姓名。" << endl;
cin >> nname;
for (it1 = vk.begin(); (*it1).name != nname && it1 != vk.end(); it1++);
if (it1 == vk.end()) {
cout << "想要改变的对象不存在" << endl;
} else if ((*it1).name == nname) {
cout << "请输入新同学的学生姓名和成绩。" << endl;
cin >> n1name >> score;
(*it1).name = n1name;
(*it1).score = score;
}
break;
“Devil组”引证GPT后的撰写:
为了解决这个问题,您可以在 for 循环的条件中添加另一个条件来检查 it1 是否已经到达 vk.end()。例如:
for (it1 = vk.begin(); it1 != vk.end() && (*it1).name != nname; it1++);
这将在 it1 的值等于 vk.end() 或找到名称时退出循环。然后,如果 it1 的值等于 vk.end(),就可以输出相应的消息,表明未找到对象。
你的for语句后面不要加分号啊,你都加了
不知道你这个问题是否已经解决, 如果还没有解决的话: