2013-12-11 4 views
-1

Я пишу библиотечную программу, которая отображает меню опций, позволяющее пользователю добавлять новые книги в библиотеку, но в моем заявлении добавления он принимает заголовок, а затем попадает в бесконечный цикл , Я написал класс книги, который в основном использует указатели для назначения вещей, если мне нужно опубликовать их. Но когда вы запускаете программу, она компилируется, отображает меню, и когда вы выбираете добавить книгу, она принимает название, но как только вы нажмете enter, он начнет бесконечный цикл.do loop statement вызывает бесконечный цикл

#define _CRT_SECURE_NO_WARNINGS 
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
int bookCounter = 0; 
Book library[25]; 
int menuOption = 0; 
char tempt[50] = "\0"; 
char tempauth[50] = "\0"; 
char search[50] = "\0"; 
unsigned int tempp = 0; 
do 
    { 
     menuOption = 0; 

     cout << endl << "1. Show the Library" << endl; 
     cout << "2. Add a Book" << endl; 
     cout << "3. Search the Library by Title" << endl; 
     cout << "4. Exit Library" << endl; 
     cout << "Select a menu option (e.g. 1, 2, etc.): "; 
     cin >> menuOption; 

     if(menuOption == 1) 
     { 
      for(int i = 0; i < bookCounter; i++) 
      { 
       library[i].displayBook(); 
      } 
     } 
     else if(menuOption == 2) 
     { 
      cout << "Enter the Title: "; 
      cin >> tempt[50]; 
      cout << endl << "Enter the Author's name: " ; 
      cin >> tempauth[50]; 
      cout << endl << "How many pages does the book have? (just enter a   number, e.g. 675, 300): "; 
      cin >> tempp; 

      library[bookCounter].setAuthor(tempauth); 
      library[bookCounter].setTitle(tempt); 
      library[bookCounter].setPages(tempp); 

      bookCounter++; 
      menuOption = 0; 
     } 
     else if(menuOption == 3) 
     { 
      cout << "Enter a title you would like search for (will return partial matches): "; 
      cin >> search[50]; 

      for (int i = 0; i < bookCounter; i++) 
      { 
       int temp = strcmp(search, library[i].getTitle()); 
       if (temp == 1) 
       { 
        library[i].displayBook(); 
       } 
      } 
     } 

    }while(menuOption != 4); 


system("pause"); 
return 0; 
} 
+0

Обратите внимание, что 'cin >> search [50];' будет вызывать доступ за пределы и ожидает одиночный символ. – nyrl

+0

Спросите своего профессора. почему он/она не научил вас, как использовать отладчик, прежде чем задавать такие вещи. –

ответ

0

Это

cin >> tempt[50];

обращается к несуществующей записи в массиве. Вы, вероятно, имели в виду закодировать

cin >> tempt;

Или, лучше использовать std::string вместо сырого массива символов.

0

Я думаю, что эта линия вызывает проблему,

cin >> search[50]; 

вы подключаетесь из грани search массива.

0

Одна ошибка, когда вы вводите опцию меню, «возврат» остается во входном буфере. Следующее чтение char[] в вашей переменной tempt будет пропущено.

Тип cin.ignore(); после cin >> menuOption;

Кроме того, вы должны прочитать tempt вместо вместо tempt[50].

2

Проблема вызвана тем, как вы пытаетесь прочитать в массивы:

cin >> tempt[50]; 

Это пытается читать один символ в символ с индексом 50 массива tempt, который находится вне границ массива (который имеет действительные индексы в диапазоне [0,49]).

Это означает, что только первый символ введенного названия будет потребляться с выхода. Аналогично для автора. Следовательно, на самом деле читаются только первые два символа, которые вы ввели. Затем эта линия будет встречаться:

cin >> menuOption; 

Вот то, что осталось в буфере (остальная часть заголовка) будет читать, ожидая номер. Поскольку это не соответствует допустимому формату для числа, вы получите флаг ошибки в cin. Это будет означать, что все результирующие входы также потерпят неудачу, menuOption никогда не изменится, и ваша программа застрянет в цикле.

Решение проблемы должно состоять в том, чтобы читать в tempt без индекса. Вы также можете проверить, не удалось ли прочитать чтение, используя if(cin.fail()), который должен срабатывать только при возникновении ошибки. Если это так, обработайте его, а затем вызовите cin.clear(), чтобы сбросить флаги ошибок.

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