【问题标题】:Why does the compiler executes an infinite loop upon having space as a Character?为什么编译器在将空间作为字符时执行无限循环?
【发布时间】:2013-02-05 02:46:44
【问题描述】:
#include<iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int optionChosen=0;

struct bookStruct
{
    string bookTitle;
    int bookPageN;
    int bookReview;
    float bookPrice;
};

const int MAX_BOOKS=10;

int main()
{
    bookStruct books[10]={};


    do
    {
        cout << "Please Select an Option from the Menu:\n\n" << endl;
        cout << "1. Display List of Books.\n" << "2. Find Book.\n" << "3. Add New Book.\n";
        cout << "4. Delete Book.\n"<<"5. Save List to File.\n"<<"6. Load List from File.\n";
        cout << "7. Sort List.\n"<<"8. Exit.\n\n";
        cin >> optionChosen;
        switch(optionChosen)
        {
            case 1:
            {
                for (int i=0;i<MAX_BOOKS;i++)
                {
                    if(books[i].bookTitle!="\0")
                    {
                    cout << "Book Title: " << books[i].bookTitle << endl;
                    cout << "Total Pages: " << books[i].bookPageN << endl;
                    cout << "Book Review: " << books[i].bookReview << endl;
                    cout << "Book Price: " << books[i].bookPrice<< "\n\n" << endl;
                    }
                }
                break;
            }
        case 2:
        {

        }
        case 3:
        {
            for(int i=0;i<MAX_BOOKS;i++)
            {
                if(books[i].bookTitle=="\0")
                {
                cout << "\nPlease Enter the Title: ";
                cin >> books[i].bookTitle ;
                cout << "\nPlease Enter Total Number of Pages: ";
                cin >> books[i].bookPageN ;
                cout << "\nPlease Enter Rating (stars): ";
                cin >> books[i].bookReview ;
                cout << "\nPlease Enter Price: ";
                cin >> books[i].bookPrice;
                cout << "\n\nBook Added.\n\n";
                break;
                }
            }break;

        }
        case 4:
        {

        }
        case 5:
        {

        }
        case 6:
        {

        }
        case 7:
        {

        }
        default:
        {
            if(optionChosen!=8)
            {
                cout << "Wrong Input Chosen\n";
                break;
            }
        }

        }



    }
    while(optionChosen<=8);
    return 0;
}

这是我的代码。 2 问题.....1。当我按下任何不是数字(a,b,c,abc)的选项时,程序会执行无限循环(可能)并且不会停止。问#2。当我添加一本书时,如果我使用空间,代码会做同样的事情(执行可能的无限循环)并且永远不会停止。我在这里做错了什么?

【问题讨论】:

  • 顺便说一句,空的情况后面会用到,只是告诉你,让你不知道它们是干什么用的。
  • 检查任何输入操作的结果。
  • @chris 我不太明白你说什么?
  • 返回值可用于检查是否成功。这些可能会有所帮助:parashift.com/c++-faq/istream-and-ignore.html
  • 旁注:编译器不会“执行无限循环” - 它会将您的代码编译成可执行文件,然后运行它...

标签: c++ database struct switch-statement do-while


【解决方案1】:

第一个很简单。当您 cin &gt;&gt; some_int; 并且输入流中没有 int 时,它只会失败并将输入流保持在当前状态。

这意味着下次您返回另一个int 时,它仍然准备好读取非整数。

【讨论】:

  • 好的,我明白你的意思,所以这不是一个使用过的错误,而是一个死锁,基本操作无法完成,所以使用过的必须输入一个整数,对吗?
  • 好的,我明白你的意思,所以这不是一个使用过的错误,而是一个死锁,基本操作无法完成,所以使用过的必须输入一个整数,对吗?
  • @Mokammel,这并不是真正的死锁,所发生的只是包含a 的输入流和您尝试&gt;&gt; 的int 变量保持不变。当你四舍五入到&gt;&gt;ing 到一个字符串时,它会选择a。这很可能看起来像是一个无限循环,但实际上是一个序列问题。
【解决方案2】:

正如 paxdiablo 所述,非整数输入仍在输入流中。您需要调用 cin.ignore() 来提取和丢弃无效字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多