gets()函数在C ++中无法正常工作

时间:2015-08-04 16:35:08

标签: c++ gets

我写了两个带有公共类和不同主要功能的程序。

这些是代码:

COMMON CLASS

#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

class student
{
  char *name;
  int *marks,avg;
public:
  student()
   {
    int n,i,tot;
    tot=0;
    name=new char[40];
    cout<<"enter the name of the student";
    gets(name);
    cout<<"enter the number of subjects";
    cin>>n;
    marks=new int[n];
    cout<<"MARKS"<<endl;
    for(i=0;i<n;i++)
     {
        cout<<"enter the marks in subject:"<<i+1<<" ";
        cin>>*(marks+i);
        tot=tot+(*(marks+i));
     }
    avg=tot/n;
   }

    ~student()
    {
        delete[] marks;
    }

    void display()
    {
        cout<<endl<<"name of the student: "<<name<<endl;
        cout<<"the average of the student: "<<avg<<endl;
    }

}; 

第一个主要功能

int main()
{
 int n,i;
 cout<<"enter the number of students";
 cin>>n;
 student *ob=new student[n];

  for(i=0;i<n;i++)
   {
    (ob+i)->display();
   }
 return 0;
}

第二个主要功能

 int main()
 {
  student o;
  o.display();
  return 0;
 }

在带有第一个main函数的程序中,类student的构造函数中的gets()函数根本不起作用,但是使用第二个main函数它正常工作。

有人可以帮助我使用gets()正确运行第一个程序。

1 个答案:

答案 0 :(得分:1)

首先,您应该避免使用gets,因为它在C ++ 11中已弃用(请参阅http://www.cplusplus.com/reference/cstdio/gets/中的兼容性)。

您看到观察到的行为的原因是由于行

cin>>n;

以这种方式调用cin时,它会一直等到你输入完整的一行,然后尽可能地解析。在你的情况下,我希望你输入像10<Enter>这样的东西。最后一个输入将插入换行符(\n),cin>>n不会使用该换行符。然后在构造函数中调用gets()(根据其规范)读取直到输入中的第一个换行符,然后跳过它。

由于输入流中的下一个字符是\n,因此在您能够键入任何其他内容之前,它将读取空字符串。

编辑:请注意,如果将gets()替换为getline(),您将面临同样的挑战。