do loop语句导致无限循环

时间:2013-12-11 08:27:51

标签: c++ infinite-loop

我正在编写一个库程序,它显示一个选项菜单,允许用户将新书添加到库中,但在我的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;
}

4 个答案:

答案 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