如何只接受c ++中的整数

时间:2016-06-10 00:48:27

标签: c++

我是编程新手,我需要帮助我的学期项目。我制作了一个模拟酒店预订的程序,问题是每当输入第一个问题的非整数时,它就会进入无限循环。如果你进入第二个问题并输入一个非整数,它会通过删除小数点后的任何内容接受它作为整数,然后跳过下一个问题并停止运行程序。

    #include <iostream>
    #include <string>
    using namespace std;

int stay_length (int stay) 
{     
    int nights = stay;
    int total = 0*nights;
    return total;
}

int rooms_booking(int rooms)
{
    int rooms_booked = rooms;
    int total = 0;

    if(rooms_booked > 0)
     {
        total = rooms_booked * 50;
     }
    else
    {
        total = 0;
    }   
    return total;
}

int main(){
    int x;
    string repeat;
    int nights;
    int total = 0;  
    int rooms_avail = 10;
    int rooms;

    cout << "Hello! Welcome to Hotel COMP 150." << endl;
    do {
        if (rooms_avail > 0) {
         cout << "How many nights will you be staying?" << endl;

    }
    else {
        cout << "Sorry, but there are no rooms available. " << endl;
    }
         do {
         cin >> nights;


            if (nights > 0 && nights <= 28)
            {
                int total1 = stay_length(nights);
                cout << "You are staying for " << nights << " nights" << endl;
                cout << "That costs: $" << total1 << endl;
                total = total + total1;
            }
            else
            {
            cout << "You cannot stay less than 1 or more than 28 nights" << endl;
            }

         } while (nights <= 0 || nights >28);

            if (rooms_avail > 0)
            {
                cout << "How many rooms will you be booking?" << endl;
                    cout << "There are " << rooms_avail << " available." << endl;
                    cin >> rooms;

                    if (rooms > 0 && rooms <= rooms_avail)
                    { 
                        int total2 = rooms_booking(rooms);
                        cout << "You are booking " << rooms << " rooms." << endl;
                        cout << "That costs : $" << total2 << endl;
                        total = total + total2;
                        rooms_avail = rooms_avail - rooms;
                    }
                    else if (rooms <= 0 || rooms > rooms_avail)
                    {
                        do{
                            cout << "You can only book a minimum of 1 room or a maximum of " << rooms_avail << endl;
                            cin >> rooms;
                          } while (rooms <= 0 || rooms > rooms_avail );
                          int total2 = rooms_booking(rooms);
                          cout << "You are booking " << rooms << " rooms." << endl;
                          cout << "That costs : $" << total2 << endl;
                          total = total + total2;
                          rooms_avail = rooms_avail - rooms;
                     }
                    else
                    {
                     cout << "You cannot book more than " << rooms_avail << endl;
                    }

             }

             else
             {
                cout << "Sorry, all rooms have been booked." << endl;
             }
    cout << "Your total so far is: $" << total << endl;
    cout << "Would you like to make another booking? Enter 'Y' or 'y' to do so."  << endl;
    cin >> repeat;

         }while(repeat == "Y" || repeat == "y");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

最好使用std::getline()代替operator>>来阅读std::cin的互动输入。

operator>>不是用于从标准输入读取单行文本并存储它。这就是std::getline()的用途。

如果输入了错误的输入类型,而不是operator>>期望的输入,则会将std::cin设置为失败状态,这会使将来尝试读取std::cin的所有尝试立即失败,从而导致你正在观察的无限循环。

要正确地做到这一点,它将是:

1)始终在fail()之后检查operator>>,看输入是否失败,如果是,则从错误clear()恢复,然后ignore()。这很快变老了。

2)用std::getline()读取单行文本要容易得多,然后自己解析输入。如果您愿意,可以构建std::istringstream,并使用operator>>,如果这样可以让您更轻松。

答案 1 :(得分:0)

您可以通过控制台实现基本的用户输入错误检查:

int nights = 0;
// error checking loop
while(1) {
    std::cout << "How many nights will you be staying?" << endl;
    std::cin >> nights; 
    // input valid
    if(!std::cin.fail() && (std::cin.peek() == EOF || std::cin.peek() == '\n')
        && nights > 0 && nights <= 28) {
        // do stuff
        break; // break from while loop
    }
    // input invalid
    else {
        std::cin.clear();
        std::cin.ignore(256, '\n');
        std::cout << "An input error occurred." << std::endl;
    }
}