[英]looping with cin inside the loop, thus storing different char*s in an array (c++)
我正在用C ++编写一个基本程序,该程序创建一个学生数据库(每个学生的姓名,专业和GPA)。 用户输入数据库中有多少学生,然后逐一输入每个学生的数据项。
我制作了一个循环,执行“ x学生”的次数,并通过为每个数据项调用cin.getline
然后将学生逐个添加到学生数组中,然后使用这些项目创建学生实例来将其添加到数组中在下一个可用的地方。
Name
和major
是char*
变量(对于该分配,它们不能是字符串)。
我遇到了(基于指针的)基于指针的问题,因为在对学生数组进行监视之后,我意识到,一旦将一个新学生添加到数组中,该数组中的每个先前学生都将设置为相同的值数据作为新学生。 我认为这是因为变量的名称始终是相同的,因为它们在一个循环中,所以我认为当我创建一个新的Student对象时,它始终被放在相同的地址中,从而更改了数组中的所有先前项目。
我尝试删除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;
}
注意:当我的析构函数被调用时,它也会使用一串乱码来填充本应删除的名称和主要变量,但这是另一个问题。 我评论了一段时间以暂时解决此问题,但我意识到这不是一个长期解决方案(两者可能是相关的)
如果您希望看到更多代码,我很乐意将其发布,那么我将尽量缩短代码长度,我不确定是否需要更多代码。
非常感谢您的见解
您必须复制传递的字符串,而不仅仅是分配传递的指针 。
尝试这个:
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.