2013-10-08 9 views
-1

프로그램이 컴파일되어 실행되지만 2 개 이상의 항목을 입력하면 두 번째 전화 번호를 입력하는 순간 충돌이 발생합니다. 여기에 내가 입력 한 내용이며, 호출 스택 :문자열을 읽을 때 충돌이 발생합니다.

crash

" 가 0xc0000005 : 도서관 Holdings.exe에서 0x013A6EC6에서 처리되지 않은 예외입니다. 액세스 위반 읽기 위치를 0x00000000"

두 번째 전화 번호를 입력하기 전에 이번에는 충돌이 발생했습니다. 여기

은, 무슨 일이 있었 또 다른 충돌 일부 이유로 다른 지점에서 충돌하지만, 이것은 내가 를 얻고 있었다 가장 일반적인 충돌했다 crash

0x779B016E 도서관 Holdings.exe에서 (NTDLL.DLL)에서

처리되지 않은 예외 : 0x00000000 : 작업이 성공적으로 완료되었습니다.

내가 충돌을 멈추게하려면 어떻게해야할까요?

LibraryDrv.h :

#ifndef _LIBRARYDRV_H 
#define _LIBRARYDRV_H 

#include "Holding.h" 
#include "Recording.h" 
#include "Book.h" 

Holding* inputHolding(); 

#endif 

LibraryDr.cpp :

#include <iostream> 
#include "LibraryDrv.h" 

using namespace std; 

int main() { 
Holding *hptr[5]; 

for (int i = 0; i < 5; i++) { 
    hptr[i] = inputHolding(); 
} 

for (int i = 0; i < 5; i++) { 
    hptr[i]->print(); 
} 

return 0; 
} 

Holding* inputHolding() { 
char selection; 
char title[50]; 
int callNumber = 0; 
char author[50]; 
char performer[50]; 
char format; 

cout << "Enter B for book, R for recording: "; 
cin >> selection; 

if (selection == 'B') { 
    cout << "Enter book title: "; 
    cin >> title; 

    cout << "Enter book author: "; 
    cin >> author; 

    cout << "Enter call number: "; 
    cin >> callNumber; 

    Book* aBook = new Book(title, callNumber, author); 
    return aBook; 
} 
else if (selection == 'R') { 
    cout << "Enter recording title: "; 
    cin >> title; 

    cout << "Enter performer: "; 
    cin >> performer; 

    cout << "Enter format: (M)P3, (W)AV, (A)IFF: "; 
    cin >> format; 

    cout << "Enter call number: "; 
    cin >> callNumber; 

    Recording* aRecording = new Recording(title, callNumber, performer,  format); 
    return aRecording; 
} 
else { 
    cout << "Incorrect selection" << endl; 
    return nullptr; 
} 

}

Holding.h

#ifndef _HOLDING_H 
#define _HOLDING_H 

class Holding { 
protected: 
int callNumber; 
char* title; 

public: 
Holding(); 
Holding(const Holding&); 
Holding(char*, int); 
virtual void print() = 0; 
virtual ~Holding(); 
}; 

#endif 

Holding.cpp

#include "Holding.h" 
#include "String.h" 

Holding::Holding() { 

} 

Holding::Holding(const Holding& copy) { 
title = new char[strlen(copy.title) + 1]; 

strcpy_s(title,sizeof(title), copy.title); 
callNumber = copy.callNumber; 
} 

Holding::Holding(char* copy, int inputCall) { 
int len = strlen(copy) + 1; 
title = new char[len]; 

strcpy_s(title, sizeof(char) * len, copy); 
callNumber = inputCall; 
} 

Holding::~Holding() { 
delete [] title; 
} 

Book.h :

#ifndef _BOOK_H 
#define _BOOK_H 

#include "Holding.h" 

class Book : public Holding { 
private: 
char* author; 

public: 
Book(); 
Book(const Book&); 
Book(char*, int, char*); 
virtual void print(); 
virtual ~Book(); 
}; 

#endif 

Book.cpp

#include <iostream> 
#include "Holding.h" 
#include "Book.h" 
#include "String.h" 

using namespace std; 

Book::Book() { 
author = nullptr; 
} 

Book::Book(const Book& copy) : Holding(copy) { 
author = new char[strlen(copy.author) + 1]; 

strcpy_s(author, sizeof(author), copy.author); 
} 

Book::Book(char* inputTitle, int inputCallNum, char* inputAuthor) : Holding(inputTitle, inputCallNum) { 
int len = strlen(inputAuthor) + 1; 
author = new char[len]; 

strcpy_s(author, sizeof(author)*len, inputAuthor); 
} 

Book::~Book() { 
delete [] author; 
} 

void Book::print() { 
cout << "BOOK: " << author << " " << title << " " << callNumber << endl; 
} 

Recording.h :

#ifndef _RECORDING_H 
#define _RECORDING_H 

#include "Holding.h" 

class Recording : public Holding { 
private: 
char* performer; 
char format; 

public: 
Recording(); 
Recording(const Recording&); 
Recording(char*, int, char*, char); 
virtual void print(); 
virtual ~Recording(); 

}; 

#endif 

Recording.cpp :

#include <iostream> 
#include "String.h" 
#include "Holding.h" 
#include "Recording.h" 

using namespace std; 

Recording::Recording() { 

} 

Recording::Recording(const Recording& copy) : Holding(copy) { 
int len = strlen(copy.performer) + 1; 
performer = new char[len]; 

strcat_s(performer, sizeof(performer)*len, copy.performer); 
format = copy.format; 
} 

Recording::Recording(char* inputTitle, int inputCallNum, char* inputPerformer, char  inputFormat) 
: Holding(inputTitle, inputCallNum) { 
int len = strlen(inputPerformer) + 1; 
performer = new char[len]; 

strcpy_s(performer, sizeof(performer)*len, inputPerformer); 
format = inputFormat; 
} 

Recording::~Recording() { 
delete [] performer; 
} 

void Recording::print() { 
cout << "RECORDING: " << title << " " << performer << " (" << format << ") " <<  callNumber << endl; 
} 
,
+0

이것은 무엇입니까? 개미에 대한 디버깅? 예외가 있습니까? – nhgrif

+0

당신은 또한'Book.h'을 두 번 붙여 넣었습니다 ('Book.cpp'도 없음) – yan

+0

제 친구들은 12/11 줄에 뭔가 잘못되었다고 말하고 있습니다. 어떤 파일인지는 확실하지 않습니다. 개미는 아직 그것을 알아 내지 못했습니다. 두 줄 (이 줄 번호를 참조하는 줄)은 무엇을 말합니까? 그 줄이 무엇인지 알아 내고 그 줄을 알아낼 수 있습니까? – nhgrif

답변

1

cin은 '>>'을 사용할 때 한 단어 만 사용할 수 있습니다. 따라서 "good bye"라고 입력하면 cin은 작성자에게 "good"을 할당하고 "bye"는 버퍼에 남아 있기 때문에 자동으로 callNumber에 할당하려고 시도하지만 callNumber가 int var이므로 잘못된 비트 예외가 발생합니다. 그래서 하나는 다음에 입력 방법을 하나의 단어 입력을 입력하거나 변경 :

///cout statement here 
getline(cin, title); 
cin.ignore(); 

///cout statement here 
getline(cin, author); 
cin.ignore() 

cin.ignore는 단순히이 입력 된 문자열 키 추가를 입력 한 내용 인 '\ n'을 무시하는 것이다. cin.ignore를 생략하면 '\ n'이 여전히 버퍼에 있으므로 동일한 문제가 발생합니다.

관련 문제