Запись о нарушении доступа?
class Student { public: //Accessor int fetchAge(); int *fetchDaysInCourse(); string fetchEmail(); string fetchFirstName(); string fetchLastName(); string fetchStudentId(); Degree fetchDegreeType(); //Mutators void mutateAge(int); void mutateDaysInCourse(int[1]); void mutateEmail(string); void mutateFirstName(string); void mutateLastName(string); void mutateStudentId(string); void mutateDegreeType(Degree); //other handlers virtual void print(); virtual Degree fetchDegreeProgram(); //constructor Student(int age, int daysInCourse[3], string studentId, string email, string firstName, string lastName, Degree degreeType); ~Student(); private: int Age, DaysInCourse[1]; string Email, FirstName, LastName, StudentId; Degree DegreeType; };
using namespace std; int main() { //personal information for start screen cout << "Course Title: Scripting and Programming - Applications - C867 \n"; cout << "Language used: C++ \n"; cout << "Student ID: 467185 \n"; cout << "Written by: Gregory Young \n\n"; Roster classRoster; const string studentData[] = { "A1,John,Smith,John1989@gm ail.com,20,30,35,40,SECURITY", "A2,Suzan,Erickson,Erickson_1990@gmailcom,19,50,30,40,NETWORK", "A3,Jack,Napoli,The_lawyer99yahoo.com,19,20,40,33,SOFTWARE", "A4,Erin,Black,Erin.black@comcast.net,22,50,58,40,SECURITY", "A5,Gregory,young,gyoun15@wgu.edu,29,30,20,33,40,SOFTWARE" }; //fill the class roster array for (int i = 0; i < sizeof(studentData) / sizeof(studentData[i]); i++) { cout << studentData[i] << endl; string input = studentData[i]; istringstream ss(input); string token; string tempHolder[9]; int x = 0; while (x < 9 && getline(ss, token, ',')) { tempHolder[x] = token; x += 1; } Degree studentDegree; if (tempHolder[8] == "NETWORK") { studentDegree = NETWORKING; } else if (tempHolder[8] == "SECURITY") { studentDegree = SECURITY; } else if (tempHolder[8] == "SOFTWARE") { studentDegree = SOFTWARE; } else { studentDegree = NODEGREE; } classRoster.add(tempHolder[0], tempHolder[1], tempHolder[2], tempHolder[3], std::stoi(tempHolder[4]), std::stoi(tempHolder[5]), std::stoi(tempHolder[6]), std::stoi(tempHolder[7]), studentDegree); } classRoster.printAll(); cout << "\n"; classRoster.printInvalidEmails(); cout << "\n"; for (int i = 0; i < sizeof(classRoster.classRosterArray) / sizeof(classRoster.classRosterArray[i]); i++) { classRoster.printDaysInCourse(classRoster.classRosterArray[i]->fetchStudentId()); } cout << "\n"; classRoster.printByDegreeProgram(SOFTWARE); cout << "\n"; classRoster.remove("A3"); classRoster.remove("A3"); return 0; } void Roster::add(string studentID, string firstName, string lastName, string email, int age, int daysInCourse1, int daysInCourse2, int daysInCourse3, Degree degreeProgram) { int courseDays[3] = { daysInCourse1, daysInCourse2, daysInCourse3 }; for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) { if (classRosterArray[i] == nullptr) { if (degreeProgram == NETWORKING) { classRosterArray[i] = new NetworkStudent(age, courseDays, studentID, email, firstName, lastName, degreeProgram); } else if (degreeProgram == SECURITY) { classRosterArray[i] = new SecurityStudent(age, courseDays, studentID, email, firstName, lastName, degreeProgram); } else if (degreeProgram == SOFTWARE) { classRosterArray[i] = new SoftwareStudent(age, courseDays, studentID, email, firstName, lastName, degreeProgram); } else { classRosterArray[i] = new Student(age, courseDays, studentID, email, firstName, lastName, degreeProgram); } break;//stop } } } void Roster::printAll() { for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) { classRosterArray[i]->print(); } } void Roster::printByDegreeProgram(int degreeProgram) { for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) { if (classRosterArray[i]->fetchDegreeProgram() == degreeProgram) { classRosterArray[i]->print(); } } } void Roster::printDaysInCourse(string studentID) { float avg = 0; int max = 3; for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) { if (classRosterArray[i] != nullptr && classRosterArray[i]->fetchStudentId() == studentID) { int *daysInCourse = classRosterArray[i]->fetchDaysInCourse(); for (int x = 0; x < max; x++) { avg += daysInCourse[x]; } cout << "Student " << classRosterArray[i]->fetchStudentId() << "'s average number of days in each course is." << (avg / max) << "\n"; break; } } } void Roster::printInvalidEmails() { for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) { string email = classRosterArray[i]->fetchEmail(); bool isValid = false; size_t found = email.find("@"); if (found != string::npos) { found = email.find("."); if (found != string::npos) { found = email.find(" "); if (found == string::npos) { isValid = true; } } } if (!isValid) { cout << email << " is not a valid email address \n"; } } } void Roster::remove(string studentID) { bool studentRemoved = false; for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) { if (classRosterArray[i] != nullptr && classRosterArray[i]->fetchStudentId() == studentID) { classRosterArray[i] = nullptr; studentRemoved = true; break; } } if (studentRemoved == false) { cout << "ERROR: Student ID '" << studentID << "' was not found."; } } Roster::~Roster() { delete * classRosterArray; } string Student::fetchEmail() { return Email; }
#include "Student.h" //basic operation for return of requested information int Student::fetchAge() { return Age; } int * Student::fetchDaysInCourse() { return DaysInCourse; } void Student::mutateEmail(string email) { Email = email; } string Student::fetchEmail() { return Email; } string Student::fetchFirstName() { return FirstName; } string Student::fetchLastName() { return LastName; } string Student::fetchStudentId() { return StudentId; } Degree Student::fetchDegreeType() { return Degree(); } void Student::mutateAge(int age) { Age = age; } void Student::mutateDaysInCourse(int *daysInCourse) { for (int i = 0; i < 3; i++) { DaysInCourse[i] = daysInCourse[i]; } } void Student::mutateFirstName(string firstName) { FirstName = firstName; } void Student::mutateLastName(string lastName) { LastName = lastName; } void Student::mutateStudentId(string studentId) { StudentId = studentId; } void Student::mutateDegreeType(Degree degreeType) { DegreeType = degreeType; } Student::Student(int age, int daysInCourse[3], string studentId, string Email, string firstName, string lastName, Degree degreeType) { mutateAge(age); mutateStudentId(studentId); mutateEmail(Email); mutateFirstName(firstName); mutateLastName(lastName); mutateDegreeType(degreeType); mutateDaysInCourse(daysInCourse); mutateDegreeType(degreeType); } void Student::print() { int *daysInCourse = fetchDaysInCourse(); cout << fetchStudentId() << "\t"; cout << "First Name: " << fetchFirstName() << "\t"; cout << "Last Name: " << fetchLastName() << "\t"; cout << "Age: " << fetchAge() << "\t"; cout << "daysInCourse: " << daysInCourse[0] << "8" << daysInCourse[1] << "8" << daysInCourse[2] << "\t"; cout << "Degree Program: "; switch (fetchDegreeProgram()) { case 0: cout << "Security"; break; case 1: cout << "Networking"; break; case 2: cout << "Software"; break; case 4: cout << "Unknown or Unspecified"; break; } } Degree Student::fetchDegreeProgram() { return NODEGREE; } Student::~Student() { }
Что я уже пробовал:
Я получаю нарушение доступа на чтение в строке обратного письма; я также включил соответствующий код из класса студентов. Я действительно не уверен, почему он сталкивается с нарушением доступа к чтению, которое, по-видимому, не может прочитать символы из строки.
John R. Shaw
Попробовать "а (х &ЛТ; 9 и усилитель; & Гэтлину(СС, маркер, ','))" для начала.
gtyoung2
Это решило этот вопрос, спасибо! к сожалению, я столкнулся с другой ошибкой, которая теперь читается для моей функции fetch email. По-видимому, у него есть проблема с чтением строки, я добавил это к вопросу выше, если вы хотите взглянуть
Richard MacCutchan
Пожалуйста, отредактируйте свой вопрос с помощью обновленного кода и точно объясните, в чем заключается проблема и где она возникает.
gtyoung2
сделано.
Richard MacCutchan
Да, но вы ничего не объяснили. Мы не можем догадаться, что именно Email
ссылаться.
gtyoung2
Электронная почта должна в конечном счете ссылаться на строку электронной почты, указанную в
//конструктор
Студент(инт возраста, daysInCourse инт[3], studentId строки, строки письма, строки "имя", строки "фамилия", степень degreeType);
который является адресом электронной почты, который присваивается массиву через
const string studentData[] =
{
"А1,Джон,Смит,John1989@ГМ ail.com,20,30,35,40,безопасности",
"А2,Сюзан,Эриксон,Erickson_1990@gmailcom,19,50,30,40,сеть",
"А3,Джек,Наполи,The_lawyer99yahoo.com,19,20,40,33,программное обеспечение",
-А4,Эрин,черный,Erin.black@comcast.net,22,50,58,40,безопасность",
"А5,Григорий,молодой,gyoun15@wgu.edu,29,30,20,33,40,программное обеспечение"
};
и массив списков классов
Richard MacCutchan
Но это не так. Если вы действительно проходите через приведенный выше код, вы ничего не назначаете электронной почте.
Richard MacCutchan
"Электронная почта должна в конечном счете ссылаться на"
Все это прекрасно, но к чему это на самом деле относится? Я не могу найти нигде в приведенном выше коде, где вы назначаете какое-либо значение этой переменной.
gtyoung2
Он должен быть назначен в void Student::mutateEmail(строка электронной почты). Извините, что я не включил этот раздел ранее. У меня это довольно плохо получается, спасибо, что уделили мне время.
Richard MacCutchan
Поговорка - так и должно быть ..." на самом деле это не помогает. Вам нужно использовать отладчик, чтобы точно отследить, что происходит, так как мы не можем запустить весь этот код или угадать, что происходит.
gtyoung2
Проблема в том, что отладка на самом деле не приводит меня туда, где происходит проблема.
'Project1.exe' (Win32): Загружено 'C:\Users\greg\source\repos\Project1\Debug\Project1.exe". Символы загружены.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\ntdll.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\kernel32.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\KernelBase.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): загружено 'C:\Program файлы\AVAST Software\Avast\aswhookx.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\msvcp140d.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\vcruntime140d.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\ucrtbased.dll". Не удается найти или открыть файл PDB.
Исключение, вызванное в 0x56504BB7 (vcruntime140d.dll) в Project1.exe: 0xC0000005: нарушение доступа к местоположению чтения 0x00000028.
Затем выводит меня на строку string Student::fetchEmail()
{
возврат электронной почты; <-
}
Который говорит об ошибке чтения символов строки. Есть ли способ, которым я могу копнуть немного глубже в отладчик, чтобы проследить, что вам нужно?
Richard MacCutchan
Вам нужно посмотреть на трассировку стека, чтобы увидеть, как она достигла этой точки из вашей программы. Трассировка должна давать вам имена методов и/или номера исходных строк. Вы также можете добавить точки останова в тех местах, где осуществляется доступ к этой переменной. К сожалению, такого рода ошибки никогда не легко найти, вам просто нужно продолжать пробовать разные вещи.