2016-09-26 17 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(""); 
    } 
} 

それとも、10個の要素のためのスペースを作るためにclassList.reserve(10);を行うことができ、ループの前に。

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

関連する問題