2016-09-26 95 views
-2

我在我的智慧结束这段代码,我是新来的C++,所以我甚至不知道从哪里开始检查这个错误。什么导致我的代码中的分段错误,我该如何解决它?我不知道是什么导致我的代码中的段错误

#include <iostream> 
#include <string> 
#include <vector> 
#include <sstream> 
using namespace std; 

class Student 
{ 
    private: 
    string name; 
    int numClasses; 
    vector<string> classList; 

    public: 
    Student (string nameVal, int numClassesVal, string classListArr[]); 
    Student (string nameVal, int numClassesVal); 
    Student (string nameVal); 
    Student(); 
    void setName(string nameVal); 
    void setNumClasses(int numClassesVal); 
    void setClassList(string classListArr[]); 
    string getName(); 
    int getNumClasses(); 
    vector<string> getClassList(); 
    void input(); 
    void output(); 
    void reset(); 
}; 



int main() 
{ 
    Student user; 
    string answer; 
    int flag = 1; 

    while (flag == 1) 
    { 
    user.input(); 
    user.output(); 

    cout << "Do you want to enter the new data? (y/n)" << endl; 
    cin >> answer; 
    cin.ignore(); 

    if (answer == "n") 
    { 
     flag == 0; 
    } 
    } 

    return 0; 
} 

Student::Student (string nameVal, int numClassesVal, string classListArr[]) 
    : name(nameVal), numClasses(numClassesVal) 
{ 
    string test = classListArr[0]; 
    for (int x = 0; x < 10; ++x) 
    { 
    if ((x > 0) && (classListArr[x] == test)) 
     break; 
    classListArr[x] = classList[x]; 
    } 
} 

Student::Student (string nameVal, int numClassesVal) 
{ 
    name = nameVal; 
    numClasses = numClassesVal; 

    for (int x = 0; x < 10; ++x) 
    { 
    classList[x] = ""; 
    } 
} 

Student::Student (string nameVal) 
{ 
    name = nameVal; 
    numClasses = 0; 

    for (int x = 0; x < 10; ++x) 
    { 
    classList[x] = ""; 
    } 
} 

Student::Student() 
{ 
    name = ""; 
    numClasses = 0; 

    for (int x = 0; x < 10; ++x) 
    { 
    classList[x] = ""; 
    } 
} 


void Student::setName(string nameVal) {name = nameVal;} 

void Student::setNumClasses(int numClassesVal) {numClasses = numClassesVal;} 

void Student::setClassList(string classListArr[]) 
{ 
    string test = classListArr[0]; 
    for (int x = 0; x < 10; ++x) 
    { 
    if ((x > 0) && (classListArr[x] == test)) 
     break; 
    classListArr[x] = classList[x]; 
    } 
} 

string Student::getName() {return name;} 

int Student::getNumClasses() {return numClasses;} 

vector<string> Student::getClassList() {return classList;} 

void Student::input() 
{ 
    string temp; 
    int classes; 
    cout << "Input Student's Name:" << endl; 
    getline(cin, temp); 
    name = temp; 
    cout << "Input Number of Classes:" << endl; 
    cin >> classes; 
    cin.ignore(); 
    numClasses = classes; 

    for (int x = 0; x < 10; ++x) 
    { 
    if (x == 9) 
    { 
     cout << "Input Last Class Name (Maximum of 10):"; 
     getline(cin, temp); 
     classList[9] = temp; 
    } 
    else 
    { 
     cout << "Input Class Name:"; 
     getline(cin, temp); 
     classList[x] = temp; 
     cout << "Do you have any more classes? (y/n):"; 
     getline(cin, temp); 

     if (temp == "n") 
     break; 
    } 
    } 

} 

void Student::output() 
{ 
    cout << "Student Name: " << name << "\nNumber of Classes: " << numClasses << endl; 


cout << "Names of Classes: " << endl; 

    for (int x = 0; x < 10; ++x) 
    { 
    if (numClasses == 0) 
     break; 
    if (x == 0) 
     cout << "Names of Classes: \n"; 
    if (classList[x] == "") 
     break; 

    cout << "(" << x << ") " << classList[x] << "\n"; 
    } 
} 

void Student::reset() 
{ 
    numClasses = 0; 
    for (int x = 0; x < 10; ++x) 
    { 
    classList[x] = ""; 
    } 
} 

我试着改变了之前我有一个goto语句而不是一个标志,并没有解决它的主要功能。我认为这是cin.getline(),但我不确定。

+3

解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+0

'flag == 0;' - >'flag = 0;', –

+1

'Student'构造函数赋给'classList [x]'而不创建该元素。 – Barmar

回答

1

你有这个代码(以及其他构造函数)未定义的行为:

Student::Student() 
{ 
    name = ""; 
    numClasses = 0; 

    for (int x = 0; x < 10; ++x) 
    { 
    classList[x] = ""; 
    } 
} 

你从未被分配在classList向量的任何元素,所以参考classList[x]是出界。您应该使用.push_back()新元素添加到向量:

Student::Student() 
{ 
    name = ""; 
    numClasses = 0; 

    for (int x = 0; x < 10; ++x) 
    { 
    classList.push_back(""); 
    } 
} 

或者循环之前,你可以做classList.reserve(10);以腾出空间给10元。

请参阅C++ Tutorial: A Beginner's Guide to std::vector

相关问题