我正在用C ++编写一个基本程序,用于创建学生数据库(每个学生的名字,专业和GPA)。用户输入数据库中将有多少学生,然后逐个输入每个学生的数据项。
我创建了一个执行“x student”次数的循环,并通过为每个数据项调用cin.getline
,然后创建一个包含这些项目的Student实例,将学生逐个添加到学生数组中它会在下一个可用的位置添加到数组中。
Name
和major
是char*
个变量(它们不能是此作业的字符串)。
我(我假设)基于指针的问题,因为在对学生数组进行监视之后,我意识到只要将新学生添加到数组中,就会设置数组中的每个先前学生与新学生相同的数据。我认为这是因为变量的名称总是相同的,因为它们在循环中,我认为当我创建一个新的Student对象时,它会被放在同一个地址中,从而改变数组中所有先前的项目。 / p>
我已尝试删除newStudent
的地址,并且在添加新学生后我尝试将其设置为NULL
,但我的程序要么中断,要么newStudent中的名称和专业成为行乱搞而不是删除他们的内容。
以下是来自main.cpp的相关内容:(我删除了我试图删除内容并将内容设置为NULL
的部分,因为它们使情况变得更糟,我不知道我是否在正确的轨道上)。这只是主要的第一部分。它在我写的之后调用了其他函数,但我测试了它们并且它们都工作正常。这是让它全部破裂的部分。
#include<iostream>
#include "student.h"
using namespace std;
int main(){
int numMajors = 0; // keeps track of the total number of Majors
int currAdded = 0; // keeps track of how many students have been added THUS FAR
const int MAX_MAJORS = 100; // max number of majors allowed
const int MAX_LENGTH = 25; // max length of character array
const int TABLE_SIZE = 100; // max table size
int numStudents = 0; // total number of students being added
char* name = new char[MAX_LENGTH]; // cin>>name
char* major = new char[MAX_LENGTH]; // cin>>major
float GPA = 0; // cin>>gpa
//Get Data
cout << "--Student Database Data Entry--" << endl << endl;
cout << "Enter the number of students in registry: ";
cin >> numStudents;
cout << endl << "Enter data for each student: " << endl;
Student table[TABLE_SIZE];
char* majors[MAX_MAJORS];
for(int i = 0; i < numStudents; i++){
cout << " Student " << (i+1) << " : " << endl;
cout << " Last Name: ";
// need to use getline to cin multiple words, so using
// cin.ignore() to eat the trailing \n from cin>>numStudents
cin.ignore();
cin.getline(name, MAX_LENGTH);
cout << " Major: ";
cin.getline(major, MAX_LENGTH);
cout << " GPA: ";
cin >> GPA;
Student* newStudent = new Student(name, major, GPA);
table[i] = *newStudent;
currAdded++;
这是我Student
的构造函数和析构函数(在student.cpp
中)
Student::Student() :
name(NULL),
major(NULL),
GPA(0)
{
}
Student::Student(char* name, char* major, float GPA) :
name(NULL),
major(NULL),
GPA(0)
{
this->name = name;
this->major = major;
this->GPA = GPA;
}
Student::~Student()
{
if(name)
delete [] name;
if(major)
delete [] major;
}
Student& Student::operator=(Student& student)
{
this->name = student.name;
this->major = student.major;
this->GPA = student.GPA;
return *this;
}
注意:当我的析构函数被调用时,它还会填充名称和主要变量,它应该删除长字符串的乱码,但这是另一个问题。我暂时评论了暂时解决这个问题,但我意识到这不是一个长期解决方案(这两个可能是相关的)
如果你想看到更多的代码,我会很乐意发布它,我试图尽可能地保持这个,我不确定是否有必要。
非常感谢您的见解
答案 0 :(得分:2)
您必须复制传递的字符串,而不是仅仅分配传递的指针。
试试这个:
#include <cstring> // for using strlen() and strcpy()
Student::Student(char* name, char* major, float GPA) :
name(NULL),
major(NULL),
GPA(0)
{
this->name = new char[strlen(name) + 1]; // +1 for terminating null-character
strcpy(this->name, name);
this->major = new char[strlen(major) + 1];
strcpy(this->major, major);
this->GPA = GPA;
}