我写了两个带有公共类和不同主要功能的程序。
这些是代码:
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()正确运行第一个程序。
答案 0 :(得分:1)
首先,您应该避免使用gets
,因为它在C ++ 11中已弃用(请参阅http://www.cplusplus.com/reference/cstdio/gets/中的兼容性)。
您看到观察到的行为的原因是由于行
cin>>n;
以这种方式调用cin
时,它会一直等到你输入完整的一行,然后尽可能地解析。在你的情况下,我希望你输入像10<Enter>
这样的东西。最后一个输入将插入换行符(\n
),cin>>n
不会使用该换行符。然后在构造函数中调用gets()
(根据其规范)读取直到输入中的第一个换行符,然后跳过它。
由于输入流中的下一个字符是\n
,因此在您能够键入任何其他内容之前,它将读取空字符串。
编辑:请注意,如果将gets()
替换为getline()
,您将面临同样的挑战。