我正在编写一个库程序,它显示一个选项菜单,允许用户将新书添加到库中,但在我的add语句中,它接受标题,然后陷入无限循环。我写了一本书类主要使用指针分配东西,如果我需要发布我会的。但是当你运行程序时,它会编译,显示菜单,当你选择添加一本书时,它会接受标题但是只要你点击输入它就会启动一个无限循环。
#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 :(得分:2)
问题是由您尝试读入数组的方式引起的:
cin >> tempt[50];
这会尝试将单个字符读入数组tempt
的索引50处的字符,该字符超出数组的范围(其范围为[0,49]中的有效索引)。
这意味着只会从输出中消耗输入标题的第一个字符。同样的作者。因此,实际只读取了您输入的前两个字符。然后,将遇到这一行:
cin >> menuOption;
这里,将读取缓冲区中剩余的内容(标题的其余部分),期待一个数字。由于这与数字的有效格式不匹配,因此您将在cin
中收到错误标记。这意味着所有结果输入也将失败,menuOption
将永远不会改变,并且您的程序会陷入循环。
问题的解决方案是在没有索引的情况下读入tempt
。您还可以使用if(cin.fail())
检查读取是否失败,只有在出现错误时才会触发。如果是,请处理它,然后调用cin.clear()
重置错误标志。
答案 1 :(得分:0)
这个
cin >> tempt[50];
访问数组中不存在的条目。你可能想要编码
cin >> tempt;
或者,更好的是,使用std::string
而不是原始字符数组。
答案 2 :(得分:0)
我认为这一行会导致问题,
cin >> search[50];
您正在访问search
数组的绑定。
答案 3 :(得分:0)
一个错误是当你输入菜单选项时,'return'停留在输入缓冲区中。 char[]的下一次读取将被跳过。
在tempt
cin.ignore();
此外,您应该阅读cin >> menuOption;
而不是tempt
。