2013-10-08 6 views
-1

Программа компилируется и запускается, однако, когда я ввожу 2 или более записей, она сбрасывается прямо в момент ввода второго номера вызова. Вот то, что я вхожу и стек вызовов:Сбой при чтении в строках

crash

«Необработанное исключение в 0x013A6EC6 в библиотеке Holdings.exe: 0xC0000005: Нарушение прав доступа чтения расположение 0x00000000.»

На этот раз он потерпел крах, прежде чем я успел войти во второй вызов #.

Вот еще один сбой, что произошло, происходит сбой в разных точках по какой-то причине, но это был самый распространенный аварии я получаю crash

Необработанное исключение в 0x779B016E (ntdll.dll) в библиотеке Holdings.exe: 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, присвойте «хороший» автору, и поскольку «пока» все еще находится в буфере, он автоматически попытался присвоить его вызовуNumber, но поскольку callNumber является int var, он бросил исключение из разряда. Так что либо ввести только один вклад слов, или изменить методы ввода на следующее:

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

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

cin.ignore, чтобы просто игнорировать «\ п», который является то, что ввести ключ добавляет к введенной строке. Если cin.ignore отсутствует, вы столкнетесь с той же проблемой, потому что '\ n' все еще находится в буфере.

Смежные вопросы