2009-07-17 3 views
0

У меня есть класс книги, в котором есть заголовок, автор, авторское право, номер ISBN и выписка для объекта книги. Однако при запуске программы я получаю ошибку во время выполнения. После того, как пользователь вводит название и нажимает клавишу ввода, программа пропускает вниз, показывая остальную часть выходов, а затем завершает работу программы, давая ошибку времени выполнения.Ошибка выполнения, возможная проблема ввода?

Я пытался поймать исключение, но ничего не получил.

Код:

#include "std_lib_facilities.h" 

class Book{ 
public: 
     string what_title(); 
     string what_author(); 
     int what_copyright(); 
     void store_ISBN(); 
     void is_checkout(); 
private: 
     char check; 
     int ISBNfirst, ISBNsecond, ISBNthird; 
     char ISBNlast; 
     string title; 
     string author; 
     int copyright; 
}; 

string Book::what_title() 
{ 
     cout << "Title: "; 
     cin >> title; 
     cout << endl; 
     return title; 
} 

string Book::what_author() 
{ 
     cout << "Author: "; 
     cin >> author; 
     cout << endl; 
     return author; 
} 

int Book::what_copyright() 
{ 
    cout << "Copyright Year: "; 
    cin >> copyright; 
    cout << endl; 
    return copyright; 
} 

void Book::store_ISBN() 
{ 
    bool test = false; 
    cout << "Enter ISBN number separated by spaces: "; 
    while(!test){ 
    cin >> ISBNfirst >> ISBNsecond >> ISBNthird >> ISBNlast; 
    if((ISBNfirst || ISBNsecond || ISBNthird)<0 || (ISBNfirst || ISBNsecond || ISBNthird)>9) 
        error("Invalid entry."); 
    else if(!isdigit(ISBNlast) || !isalpha(ISBNlast)) 
      error("Invalid entry."); 
    else test = true;}  
} 

void Book::is_checkout() 
{ 
    bool test = false; 
    cout << "Checked out?(Y or N): "; 
    while(!test){ 
    cin >> check; 
    if(check = 'Y') test = true; 
    else if(check = 'N') test = true;         
    else error("Invalid value.");} 
} 

int main() 
{ 
    Book one; 
    one.what_title(); 
    one.what_author(); 
    one.what_copyright(); 
    one.store_ISBN(); 
    one.is_checkout(); 
    keep_window_open(); 
} 

Не уверен, что эта проблема может быть. Любая помощь приветствуется, спасибо.

Выходной пример:

Название: Пролетая над гнездом кукушки (следующие строки на самом деле не разнесены между ними и все вывода сразу) Автор:

Copyright Год:

Введите номер ISBN, разделенный пробелами:

Это приложение попросило Runtime прекратить его необычным способом. Для получения дополнительной информации обратитесь в службу поддержки.

Также не беспокойтесь о функциях keep_window_open и ошибок. Они являются частью std_lib_facilities.h и, скорее всего, не вызывают проблемы. Ошибка вызывает сообщение об ошибке, если возникла проблема.

+1

Что такое keep_window_open? –

+0

Как насчет отображения всего необходимого кода (как предлагает Алекс, keep_window_open), а также отображения ввода/вывода вашей программы, чтобы мы могли точно видеть, что печатается и где оно терпит неудачу. – Tom

+0

Я просто сделал быстрый google std_lib_facilities.h, и это для курса ... у него есть функция keep_window_open: http://www.stroustrup.com/Programming/std_lib_facilities.h – Tom

ответ

2

Проблема заключается в том, что входные потоки C++ не удаляют входные данные с малой формой, с которыми они сталкиваются. Другими словами, если вы попытаетесь прочитать число и поток содержит, например, символ «x» (а не число), этот символ не будет удален из входного потока. Кроме того, если я правильно помню, это также помещает входной поток в состояние ошибки, заставляя также форматированный ввод также терпеть неудачу. Хотя есть механизм для проверки состояния входного потока и удаления неправильного ввода и очистки флажков ошибок, я лично нашел, что проще всегда читать строку (используя «>>» или «getline»), а затем анализировать Струна. Например, в случае номера вы можете использовать функции strtol или strtoul.

+0

Да, я сидел здесь, думая и понимая, что он принимает только «The» строки и использует другие входы для следующих функций. Я попробую ваше предложение. – trikker

+0

Yup getline работал! Спасибо, просто нужно толчок в правильном направлении. – trikker

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