2014-02-15 29 views
1

我被指示編寫的程序是收集學生信息。這是非常基本的,但在說明中,我沒有學生人數(沒有問題)或每個學生的測試次數(問題)。我被指示創建一個指向結構的指針併爲每個學生創建一個雙指針數組。我做到了。當輸入到結構點處的雙指針數組時,程序崩潰

但是,每當我嘗試輸入學生的考試成績時,我的程序就會崩潰。我在我的enterData()函數中試過studentData-> testscores,我試過了studentData [i] .testScores [j],* studentData-> testScores,但似乎沒有任何工作。

有人請指出我的方向是正確的。

#include <iostream> 
#include <string> 
#include <iomanip> 

using namespace std; 

struct StudentInfo 
{ 
    string name; 
    string idNum; 
    double* testScores; 
    double average; 
    char grade; 
}; 

StudentInfo enterData(StudentInfo*, int, int);//Add data to the student 
//void displayData(StudentInfo*, int);//Display the student info and grade 

int main() 
{ 
int numStudents; 
int numTests; 

cout << "Enter the amount of students to input: "; 
cin >> numStudents; 
cin.ignore(); 
cout << "Enter the number of test scores per students: "; 
cin >> numTests; 
cin.ignore(); 

StudentInfo* studentData = new StudentInfo[numStudents]; 

for(int i = 0; i < numStudents; i++); 
{ 
    studentData->testScores = new double[numTests]; 
    studentData++; 
} 


//Let the user enter students information 
enterData(studentData, numStudents, numTests); 

return 0; 
} 
//************************* 
//define enterData function 
//************************* 
StudentInfo enterData(StudentInfo* studentData, int numStudents, int numTests) 
{ 
int testTotal = 0; //Keep a total of the tests. 
double testScore; //Variable to hold user input of test score. 
for(int i = 0; i < numStudents; i++) 
    { 
    cout << "\n\nPlease enter data for Student #" << i + 1; 
    cout << "\n-------------------------------------\n"; 
    cout << "\nName: "; 
    getline(cin, studentData[i].name); 
    while(studentData[i].name.empty()) 
    { 
     cout << "Oops! You didn't enter the students's name!" << endl; 
     cout << "Please enter customer's name: "; 
     getline (cin, studentData[i].name); 
    } 
    //Get Student's Id Number 
    cout << "ID Number: "; 
    getline(cin, studentData[i].idNum); 
    while(studentData[i].idNum.empty()) 
    { 
     cout << "Oops! You didn't enter the students's ID Number!" << endl; 
     cout << "Please enter student's ID Number: "; 
     getline (cin, studentData[i].idNum); 
    } 
     //Get Student's Test Scores 
     cout << "Enter Test Scores for Student #" << i + 1 << endl; 

     for (int j = 0; j < numTests; j++) 
     { 
      cout << "Test #" << j + 1 << ": "; 
      cin >> testScore; 
      cin.ignore(); 
      studentData[i].testScores[j] = testScore; 
      testTotal += testScore; 
     } 
    //Save Students Average 
    cout << fixed << setprecision(2); 
    cout << "Student's Average: " << testTotal/numTests; 

    studentData[i].average = testTotal/numTests; 

    //Save Students Grade 
    if(studentData[i].average > 90) 
     studentData[i].grade = 'A'; 
    else if(studentData[i].average > 80) 
     studentData[i].grade = 'B'; 
    else if(studentData[i].average > 70) 
     studentData[i].grade = 'C'; 
    else if(studentData[i].average > 60) 
     studentData[i].grade = 'D'; 
    else 
      studentData[i].grade = 'F'; 
     cout << "Student's Grade: " << studentData[i].grade << endl; 

    } 
    return *studentData; 
} 
+0

清理代碼:刪除與您的問題無關的部分,並測試它是否重現了問題。 –

回答

2

遇到未定義行爲因爲你想訪問內存出數組邊界的:

// you create an array and keep pointer to first element: 
StudentInfo* studentData = new StudentInfo[numStudents]; 

// try to increment this pointer till it points behind this array: 
for(int i = 0; i < numStudents; i++);      // <-- semicolon !!! 
{ 
    studentData->testScores = new double[numTests]; 
    studentData++; 
} 

// and use this pointer that points to incorrect memory: 
enterData(studentData, numStudents, numTests); 

此外,還有你的for後分號這將導致「 (因爲分號只不過是匿名嵌套的作用域)而只能執行一次,這對函數enterData來說是足夠的,以便從第二個元素開始迭代學生,並在末尾調用UB。


你應該做的是:

StudentInfo* studentData = new StudentInfo[numStudents]; 

for(int i = 0; i < numStudents; i++) { 
    studentData[i].testScores = new double[numTests]; 
} 

enterData(studentData, numStudents, numTests); 

...,只是提醒你,請注意這一點,清洗應該反映它的分配方式:

for(int i = 0; i < numStudents; i++) { 
    delete[] studentData[i].testScores; 
} 
delete[] studentData; 
+0

更不用說'for'後面的雜散分號,所以循環甚至不會被執行... – yizzlez

+0

@awesomeyi:你有很好的眼睛:) – LihO

+0

我真的很感激它。我試圖用「studentData-> testScores」來使用指針表示法。而for循環之後的分號處理確實沒有任何幫助。 :)死亡的分號。謝謝,它現在起作用! – user3314596