循环后跳过第一个函数输入

时间:2009-07-17 16:34:45

标签: c++

标题是自我解释的。出于某种原因,在int main()的循环中,如果用户想要输入另一本书,循环将跳过第一个函数的输入并直接询问作者的姓名。例如:

标题:指环王

作者:J.R.R。托尔金

版权:1954

输入以空格分隔的ISBN编号:1 2 3 x

签出?(Y或N):Y

你完成了吗?(Y或N):N //这会开始循环,Y会发出一个中断

标题://这一行和下一行之间实际上没有空格,应该有

作者://它跳到这一行,不允许用户输入标题,如果用户继续输入信息,这个循环继续 - 总是跳过标题输入

代码:

#include "std_lib_facilities.h"

class Book{
public:
       vector<Book> books; // stores book information
       Book() {}; // constructor
       string what_title();
       string what_author();
       int what_copyright();
       void store_ISBN();
       void is_checkout();
private:
        char check;
        int ISBNfirst, ISBNsecond, ISBNthird;
        char ISBNlast;
        string title;
        string author;
        int copyright;
};

string Book::what_title()
{
       cout << "Title: ";
       getline(cin,title);
       cout << endl;
       return title;
}

string Book::what_author()
{
       cout << "Author: ";
       getline(cin,author);
       cout << endl;
       return author;
}

int Book::what_copyright()
{
    cout << "Copyright Year: ";
    cin >> copyright;
    cout << endl;
    return copyright;
}

void Book::store_ISBN()
{
     bool test = false;
     cout << "Enter ISBN number separated by spaces: ";
     while(!test){
     cin >> ISBNfirst >> ISBNsecond >> ISBNthird >> ISBNlast;
     if((ISBNfirst<0 || ISBNfirst>9) || (ISBNsecond<0 || ISBNsecond>9) || (ISBNthird<0 || ISBNthird>9))
                   error("Invalid entry.");
     else if(!isdigit(ISBNlast) && !isalpha(ISBNlast))
          error("Invalid entry.");
     else test = true;}     
     cout << endl;
}

void Book::is_checkout()
{
     bool test = false;
     cout << "Checked out?(Y or N): ";
     while(!test){
     cin >> check;
     if(check == 'Y') test = true;
     else if(check == 'N') test = true;                                
     else error("Invalid value.");}
     cout << endl;
}

int main()
{
    Book store;
    char question = '0';
    while(true){
        store.what_title();
        store.what_author();
        store.what_copyright();
        store.store_ISBN();
        store.is_checkout();
        store.books.push_back(store);
        cout << "Are you finished?(Y or N): ";
        cin >> question;
        if(question == 'Y') break;
        else if(question == 'N') cout << endl;
        else error("Invalid value.");
        }
    cout << endl;
    keep_window_open();
}

如果您对keep_window_open()和error()等函数感兴趣,可以在此处找到标题信息,但它并不真正与此问题有关。 - http://www.stroustrup.com/Programming/std_lib_facilities.h

任何帮助都将不胜感激 - 谢谢。

3 个答案:

答案 0 :(得分:5)

以下一行:

cin >> question;

读入'Y'或'N'字符。输入输入时,还可以键入“return”或“enter”。返回/输入仍在缓冲区中。当你到达getline(cin,title); 第二次通过循环,读取仍然在缓冲区中的返回/输入并解释为整行。

你需要做的是用cin.flush()清除输入缓冲区;或者您需要以字符串形式而不是字符来阅读。

以下是您的代码应该是什么样的

int main()
{
    Book store;
    char question = '0';
    while(true){
        store.what_title();
        store.what_author();
        store.what_copyright();
        store.store_ISBN();
        store.is_checkout();
        store.books.push_back(store);
        cout << "Are you finished?(Y or N): ";
        cin >> question;
        if(question == 'Y') break;
        else if(question == 'N')
        {
            cout << endl;
            cin.flush();
        }
        else error("Invalid value.");
        }
    cout << endl;
    keep_window_open();
}

答案 1 :(得分:1)

尝试

  std::cin.ignore(INT_MAX);();

这样的事情:

string Book::what_title()
{
       cout << "Title: ";
       std::cin.ignore(INT_MAX);
       getline(cin,title);
       cout << endl;
       return title;
}

如果这样做无效,请查看How do I flush the cin buffer?

读取整行(使用 getline ),因为其他一些答案表明还应该处理输入流中的流氓EOL字符。

编辑:删除了cin.flush,因为这不像我想象的那样标准。

答案 2 :(得分:1)

你在回答时点击输入

    Are you finished?(Y or N):

可以替换

吗?
cin >> question;

getline(cin,question);