为什么在代码块中执行代码时会跳过输入用户输入的行?

时间:2018-06-23 04:25:19

标签: c++ codeblocks

所以我有这段代码,但我不知道为什么代码中的两行被尖峰读取。这两行标有以下注释:

   #include <iostream>
   #include<stdio.h>

using namespace std;

class publication{
     char title[20];
     int price;

     public:

     void getdata(){
        cout<< "Enter the price of the book";
        cin>>price;

        cout<< "Enter the title";  #this line 1st
        gets(title);               #this is not running
     }

      void putdata(){
       cout<<price;
       puts(title);
       }

};

class Tape:public publication{
       float play;

       public:

       void getdata(){
         cout<< "Enter play"; #this line 2nd 
         cin>>play;
       }

       void putdata(){
           cout<<endl<<play;
       }
};

int main()
{
    publication p;
    p.getdata();
    p.putdata();

    Tape t;
    t.getdata();
    t.putdata();

    book b;
    b.getdata();
    b.putdata();

}

现在我不明白为什么我跳过了第16和47行。我检查了语法,一切都很好。该程序没有错误。我为C ++使用代码块和gnu gcc编译器。 This is the image

在此图像中,您可以看到两行代码都是自动编译的,而无需输入标题。删除了一些与问题无关的代码行。

1 个答案:

答案 0 :(得分:1)

这不是IDE或编译器的问题。不要怪可怜的人CodeBlocks:(

我不知道是什么提示您使用程序中的获取和放入。如果您最关心的是优化,请尝试将std::ios::sync_with_stdio(false);cin

一起使用

也不要使用gets,因为如果您不小心的话,它可能导致缓冲区溢出。请改用fgets。参见cplusplusstackoverflow

现在,问题来了,看起来像第16行和第47行被省略的真正原因是由于代码中的打印语句和消息不正确。似乎唯一被跳过的行是gets(title);。实际上,一切都已执行。

为什么跳过获取(标题)?

因此,当您将价格输入为12时,它实际上将存储为12\n在输入缓冲区中。现在,在读取12之后,缓冲区中仍然有\n,因为cin不会像cin.getline那样读取新行,并且gets会看到新行作为终止符。参见gets

因此使用cin.ignore(numeric_limits<streamsize>::max(), '\n');

清除缓冲区

我已经重新格式化了您的代码。见下文。 请注意,我使用了fgets,它将换行符视为有效字符,并且标题中包含了\n。参见fgets

using namespace std;

class publication {
    char title[20];
    int price;

public:

    void getdata() {
        cout << "Enter the price of the book"<<endl;
        cin >> price;

        cout << "Enter the title" << endl;

        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        fgets(title, 20, stdin);        
    }

    void putdata() {
        cout << "Price is " << price << endl;
        cout << "Title is "<< title;
    }

};

class Tape :public publication {
    float play;

public:

    void getdata() {
        cout << "Enter play"<<endl; 
        cin >> play;
    }

   void putdata() {
        cout << "Play is " << play << endl;
    }
};

int main()
{
    publication p;
    p.getdata();
    p.putdata();

    Tape t;
    t.getdata();
    t.putdata();
}