2017-11-24 1 views
-4

사용자가 입력 한 이름으로 이름을 초기화하려고 시도하는 20 번째 줄에서 코드가 충돌합니다. 벡터가 범위를 벗어나는 것 같습니다. 그 문제와 이유에 대해 알아 내도록 도와주세요. 이 코드는 사용자의 학생 데이터 입력을 가져 와서 성적에 따라 정렬 한 다음 다시 인쇄합니다. 다음은 코드입니다 : 그 시점에서벡터가 범위를 벗어남 예외라고 말하는 충돌이 발생했습니다

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 

struct studentDatabase{ 
    std::string name; 
    int grade; 
}; 

void getUserInput(std::vector<struct studentDatabase> &student) 
{ 
    std::cout << "No of students for which the data is to be entered n"; 
    int noOfStudents(0); 
    std::cin >> noOfStudents; 

    for (unsigned int i = 0; i < noOfStudents; ++i) 
    { 
     std::cout << "Enter name n"; 
     std::cin >> student.at(i).name;  // this is where it is crashing 
              //not sure why 
     std::cout << "Enter grade n"; 
     std::cin >> student.at(i).grade; 
    } 
} 

void sort(std::vector<struct studentDatabase> &student) 
{ 
    for (unsigned int i = 0; i < student.size(); ++i) 
    { 
     for (unsigned int j = 0; j < student.size() -i; j++) 
     { 
      if (student.at(i).grade < student.at(j).grade) 
       std::swap(student.at(i), student.at(j)); 
     } 
    } 
} 

void printStudentOrder(const std::vector<struct studentDatabase> &student) 
{ 
    for (unsigned int i = 0; i < student.size(); ++i) 
     std::cout << student.at(i).name << " got a grade of " << 
     student.at(i).grade << std::endl; 
} 

int main() 
{ 
    std::vector<struct studentDatabase> student; 
    getUserInput(student); 
    sort(student); 
    printStudentOrder(student); 
    return 0; 
} 
+0

벡터에 요소가 없으므로 액세스하려고합니다. .push_back을 사용하여 요소를 추가하십시오. – DeiDei

답변

1

std::vector<studentDatabase>은 처음에는 빈 컨테이너입니다. 따라서 vector::at(i)을 통해 vector에 액세스하면 항목이 발견되지 않고 out_of_range 예외가 발생합니다.

는 그런 다음, 먼저 지역 studentDatabase 변수로 데이터를 수집처럼, 벡터에 넣어 수 있습니다

for (unsigned int i = 0; i < noOfStudents; ++i) 
{ 
    studentDatabase s; 
    std::cout << "Enter name n"; 
    std::cin >> s.name; 

    std::cout << "Enter grade n"; 
    std::cin >> s.grade; 
    student.push_back(s); 
} 
1

, 당신은 위치 i의 요소에 액세스하려고하지만, 벡터는 처음에 비어 있습니다. vector 구조는 이전 스타일의 배열처럼 작동하지 않습니다. 여기서 크기를 지정해야하며 그 공간은 모두 메모리에 예약되어 있습니다.

당신은 그래서

std::vector<struct studentDatabase> student(30); 
getUserInput(student); 

같은 크기 당신의 벡터를 작성해야하지만 이전 크기를 모른다면, 난 당신이 하나의 입력을 얻고 사용하는 것이 좋습니다 push_back()

0

처음에 당신의 벡터가 빈 컨테이너입니다. 따라서 벡터에 액세스하려고하면 예외가 발생합니다.

void getUserInput(std::vector<struct studentDatabase> &student) 
{ 
    std::cout << "No of students for which the data is to be entered n"; 
    int noOfStudents(0); 
    std::cin >> noOfStudents; 

    for (unsigned int i = 0; i < noOfStudents; ++i) 
    { 
     studentDatabase stud; 
     std::cout << "Enter name n"; 
     std::cin >> student.name;  // this will get student name. 

     std::cout << "Enter grade n"; 
     std::cin >> student.grade;  // this will get student grade. 

     student.push_back(stud); // Here we are storing the data into vector. 
    } 
} 

예외를 피하기 위해 데이터에 액세스하려면 vecotor에 데이터를 저장해야합니다. 코드 스 니펫을 코드로 바꾸면 문제가 해결됩니다.