这个G ++ Getline函数代码有什么不对吗?

时间:2018-03-30 02:39:49

标签: c++ c++11 getline

当我输入ID,名称和添加时。身份和姓名输入成功,但不是姓名。

输出显示仅ID和名称,但名称显示在添加位置。

任何人都可以告诉我 getline()初始化功能是正确还是不正确?

  #include<iostream>
     using namespace std;
     class Stu_Record
     {
       private:
          int Id;
          char Name[20];
          char Add[20];

       public:
            void Input_Data();
            void Display_Data();

       };

           void Stu_Record::Input_Data()
           {
                cout<<endl<<"Enter Id,Name And Address:";
                cin>>Id;
                cin.getline(Name,20);
                cin.getline(Add,20);

           }

            void Stu_Record::Display_Data()
            {
                cout<<endl<<"Id Is :"<<ends<<Id;
                cout<<endl<<"Name Is :"<<ends<<Name;
                cout<<endl<<"Address Is :"<<ends<<Add;

            }

            int main()
            { 
                Stu_Record S;
                S.Input_Data();
                S.Display_Data();

                return(0);
             }

1 个答案:

答案 0 :(得分:3)

cin>>Id;会读取Id,但不会删除用户在其后输入的换行符。下一次调用getline会看到下一个字符是换行符,消耗它,并愉快地填充Name作为空字符串。然后,最终的getline会填写您希望转到Name的内容,因为Add的值(并且根本不会读取Add的值)。

一个简单的解决方法是在阅读Id后放弃剩余的一行,这样当你尝试阅读Name时,你就不会有垃圾。一种方法是the ignore method on input streams

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

会丢弃数据读取后的所有内容,以填充Id到下一个换行符,因此如果用户输入:

1 why did I type this garbage, oh the humanity
Fred
Where am I?

您将获得Id 1,忽略该行的其余部分,Name "Fred"Add "Where am I?"