2016-09-26 74 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

相關問題