Функция Get () не работает должным образом в переполнении стека

Я написал две программы с общим классом и различными основными функциями.

Вот эти коды:

ОБЩИЙ КЛАСС

#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;
}

В программе с первой главной функцией функция gets () в конструкторе ученика класса вообще не работает, но со второй основной функцией она работает нормально.

Может кто-нибудь, пожалуйста, помогите мне правильно запустить первую программу, используя gets ().

-1

Решение

Прежде всего, вы должны избегать использования gets как это устарело в C ++ 11 (см. Совместимость в http://www.cplusplus.com/reference/cstdio/gets/).

Причина, по которой вы видите наблюдаемое поведение, связана с линией

cin>>n;

При звонке cin таким образом, он ждет, пока вы не введете полную строку, а затем анализирует столько, сколько может. В вашем случае я ожидаю, что вы вводите что-то вроде 10<Enter>, Последний ввод введет новую строку (\n) персонаж, который не будет потребляться cin>>n, Призыв к gets() затем внутри конструктора (в соответствии с его спецификацией) произойдет чтение до первого символа новой строки на входе, а затем пропустите его.

Поскольку следующий символ во входном потоке \n он будет читать пустую строку, прежде чем вы сможете набрать что-нибудь еще.

РЕДАКТИРОВАТЬ: Обратите внимание, что вы будете иметь ту же задачу, если вы замените gets() с getline(),

1

Другие решения


По вопросам рекламы [email protected]