代码之家  ›  专栏  ›  技术社区  ›  vvs14

相继使用的getline和cin跳过下一个输入

  •  -2
  • vvs14  · 技术社区  · 9 年前

    我正在编写一个C++程序来演示聚合概念,作为一本书中的示例。该代码由4个类(在一个文件中)和一个主函数(在另一个文件)组成。 课程如下

    #include <iostream>
    #include <string>
    /*#define  SYNC_CLEAR {\
                        cin.clear();\
                        cin.sync();\
                    }
    */
    using std::string;
    using std::cout;
    using std::cin;
    
    class Student
    {
    private:
        string school;
        string degree;
    public:
        void input_data()
        {
            cout<<"Enter School name and degree name \n";
            getline(cin,school);
            getline(cin,degree);
        }
        void show_data() const
        {
            cout<<"School :"<<school<<",Degree: "<<degree<<"\n";
        }
    
    };
    
    class Employee
    {
    private:
        string name;
        unsigned int number;
    public:
        void input_data()
        {
            string str;
            cout<<"Enter Name and number \n";
            getline(cin,name);
            cin>>number;
        }
        void show_data() const
        {
            cout<<"Name :"<<name<<",number: "<<number<<"\n";
        }
    };
    
    
    /************************Aggregation starts from here**********************************/
    class Manager
    {
    private:
        string title;
        double dues;
        Employee emp;   // object of one class as an attribute to other class
        Student stu;    // object of one class as an attribute to other class
    public:
        **void input_data()
        {
            emp.input_data();   // call by object of Employee class
            cout<<"Enter Title and Dues \n";
            /*********Problem comes here*****************/
            getline(cin,title);
            cin>>dues;
            /**************************/
            stu.input_data();   // call by object of Student class
        }**
        void show_data() const
        {
            emp.show_data();
            cout<<"Title :"<<title<<",Dues: "<<dues<<"\n";
            stu.show_data();
        }   
    };
    
    class Scientist
    {
    private:
        int pubs;
        Employee emp;   // object of one class as an attribute to other class
        Student stu;    // object of one class as an attribute to other class
    public:
        void input_data()
        {
            emp.input_data();   // call by object of Employee class
            cout<<"Enter no of pubs \n";
            cin>>pubs;
            stu.input_data();   // call by object of Student class
        }
        void show_data() const
        {
            emp.show_data();
            cout<<" pubs :"<<pubs<<"\n";
            stu.show_data();
        }   
    };
    

    主要功能如下:

    #include <iostream>
    #include "aggregation.h"
    
    using std::cout;
    using std::cin;
    
    int main(int argc, char const *argv[])
    {
        Manager m1;
        Scientist s1,s2;
        cout<<"Data for Manager\n";
        m1.input_data();
    
        cout<<"Data for Sci 1\n";
        s1.input_data();
    
        cout<<"Data for Sci 2\n";
        s2.input_data();
    
        cout<<"Data for Manager\n";
        m1.show_data();
    
        cout<<"Data for Sci 1\n";
        s1.show_data();
    
        cout<<"Data for Sci 2\n";
        s2.show_data();
    
        return 0;
    }
    

    问题出现在input_data()函数中的类管理器中(以粗体突出显示)

    hduser@M-1939:~/Dropbox/c++/lafore/inhertiance$ g++ -g aggregation.cpp -o aggregation
    hduser@M-1939:~/Dropbox/c++/lafore/inhertiance$ ./aggregation 
    Data for Manager
    Enter Name and number 
    vivek 
    100
    ***Enter Title and Dues 
    sr manager***
    Enter School name and degree name 
    Data for Sci 1
    Enter Name and number 
    Enter no of pubs 
    Enter School name and degree name 
    Data for Sci 2
    Enter Name and number 
    Enter no of pubs 
    Enter School name and degree name 
    Data for Manager
    Name :vivek,number: 100
    Title :,Dues: 0
    School :,Degree: 
    Data for Sci 1
    Name :,number: 6299824
     pubs :6299824
    School :,Degree: 
    Data for Sci 2
    Name :,number: 2092888488
     pubs :6299112
    School :,Degree: 
    

    我看了一些使用cin的链接。clear()和cin。sync(),但它也不起作用。有问题,不是这样,不同,但仍然是类似的问题。 有线索吗?

    编辑1: 我使用将输入序列从1:getline2:cin更改为1:cin2:cin。ignore()3:getline,它正在工作。但有人能告诉我怎么做吗?为什么它不能以以前的方式工作。

    编辑2:我忘了放cin。cin之后的ignore()>>Employee类的input_data()中的数字。它起作用了吗。虽然这是个愚蠢的错误。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Dalphat    9 年前

    使用:

    cin.ignore(256,'\n');
    

    在每次cin调用后清理缓冲区。

    256是要忽略的字符数,“\n”是分隔字符。

    出于安全考虑,可使用

    std::numeric_limits<std::streamsize>::max()
    

    作为字符的限制数量;我只喜欢256。

    http://www.cplusplus.com/reference/istream/istream/ignore/

        2
  •  0
  •   LogicStuff    9 年前

    你需要做的是 cin.ignore() cin .
    这就是发生的情况:
    当您使用 std::getline ,它将获取该行上的任何内容,直到换行符,但是 化学发光二极管 在执行读取操作后,实际上不会删除换行符,因此 std::getline 仅获取空字符串。