0

这是我的第一篇文章。

我试着记住这些说明,但如果我错过了什么,我会提前道歉。

该程序是课堂作业,我们将使用三个不同的链接列表(学生、课程和交易,因为需要更好的词)制作成绩簿。

我发布的块将搜索列表(假设有一个,寻找具有相同信息的现有对象,这就是csearch函数的作用。

如果没有找到,则创建一个新对象,并着手将其放入列表中,始终位于尾部。

所有这些都有效,直到它到达函数的右大括号,然后它出现分段错误。

我花了一天的大部分时间试图弄清楚为什么会发生这种情况,我希望你能帮助我。

    void classes::addcourse(classes section)
   {
   int courseid;
   char  title[81];
   course *temp= NULL, *search=NULL;

   cout<<"Please enter the course id number."<<endl;
   cin>>courseid;getchar();

   cout<<"Please enter a course name."<<endl;
   cin>>title;

   search=section.csearch(courseid);               
   if (search != NULL)
      {                                                  
      cout<<"This course has already been entered."<<endl;  
      return;                                            
      }

   temp=new course(courseid);
   if (head==NULL)
      {
      sethead(temp);
      settail(temp);
      }
   tail->setnext(temp);
   settail(temp);
   section.setcnum(section.getcnum()+1);
   cout<<section.getcnum()<<endl;
   temp->setname(title);
   }

如果有帮助,这里是对象和容器的类定义,它们分别存储在 .h 文件中。

class course {
   private:
   int cid;
   int average;
   course *next;
   char name[81];

   public:
   course(int);
   void saveyourself(FILE *write);
   void loadyourself(FILE *read);

   //accessor functions
   int getcid() {return cid;}
   int getaverage() {return average;}
   course* getnext() {return next;}

   //mutator functions
   void setnext(course *val) {next=val;}
   void getname() {cout<<name;}
   void setcid (int newcid) {cid=newcid;}
   void setaverage (int newav) {average=newav;}
   void setname (char word[]) {strcpy(name, word);}
};

class classes {
   private:
   course *head;
   course *tail;
   int numcourse;

   public:
   classes();
   ~classes();
   course* csearch (int course);
   void addcourse(classes section);
   void classaverage(enrollment semester, classes section);
   void save();
   void load();

   //accessor functions
   int getcnum() {return numcourse;}
   course* gethead() {return head;}
   course* gettail() {return tail;}

   //mutator functions
   void setcnum(int num) {numcourse=num;}
   void sethead(course *val) {head=val;}
   void settail(course *val) {tail=val;}   

};

如果出现这种情况,我将使用字符数组作为字符串,因为当我厌倦了来回切换时,我最终确定了这一点。

编辑:很抱歉没有添加构造函数,我忘记了它们,它们是:

course::course(int id=-1)
   {
   cid=id;
   average=0;
   strcpy(name, "name");
   next=NULL;
   }


classes::classes()
   {
   numcourse=0;
   head=NULL;
   tail=NULL;
   }

我一直对未初始化的字符串感到偏执,所以这就是为什么它已经设置为某些东西的原因。我通常将它们初始化为“\0”,但这让我担心文件 I/O。

4

1 回答 1

0

我不相信这是在做你想做的事:

   cin>>title;

如果您要使用 C 风格的字符数组,您可能希望cin.getline()像这样使用:

   cin.getline(title, 81);

这将确保您不会溢出title[],并且会在最后放置一个 NUL 终止符。它也会在最后吃掉换行符而不是把它放进去title[]

更多信息在这里:http ://www.cplusplus.com/reference/istream/istream/getline/?kw=istream%3A%3Agetline

于 2013-08-03T06:41:37.223 回答