get () не принимает ввод

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

Я пытался поставить getch () и getchar () перед get (), но что-то не так.

Когда я пишу код, реализующий get () перед do-while (помеченный ——> 3), это работает !!!

Кто-нибудь может мне помочь?

#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;

class student
{
int rollNo;
char department[20];
int year;
int semester;

public:
student()
{
rollNo=0;
year=0;
semester=0;
}

void getData();
void promote();
void changeDepartment();
void display();
};

void student::changeDepartment()
{
if(rollNo!=0)
{
cout<<"\nEnter the new Department\n";
gets(department);                                 -------------->1
}

else
{
cout<<"\nStudent not confirmed\n";
}
}

void student::getData()
{
cout<<"\nEnter the roll no\n";
cin>>rollNo;
cout<<"\nEnter the year\n";
cin>>year;
cout<<"\nEnter the semester\n";
cin>>semester;
cout<<"\nEnter the department\n";
gets(department);                                  ----------------> 2
}

void student::promote()
{
if(rollNo!=0)
{
semester+=1;
if(semester%2==1)
{
year+=1;
}
}

else
{
cout<<"\nStudent not confirmed\n";
}
}

void student::display()
{
if(rollNo!=0)
{
cout<<"\nRoll No : "<<rollNo;
cout<<"\nYear : "<<year;
cout<<"\nSemester : "<<semester;
cout<<"\nDepartment : "<<department;
}

else
{
cout<<"\nStudent not confirmed";
}
}

int main()
{
student s;
int ch;
char choice;
----------------> 3
do
{
cout<<"\nMain Menu";
cout<<"\n1. Enter student details";
cout<<"\n2. Change department of student ";
cout<<"\n3. Promote student ";
cout<<"\n4. Display student details ";
cout<<"\nEnter your choice ";
cin>>ch;

switch(ch)
{
case 1 : s.getData();
s.display();
break;

case 2 : s.changeDepartment();
s.display();
break;

case 3 : s.promote();
s.display();
break;

case 4 : s.display();
break;
}

cout<<"\nDo you want to continue? (Y/n)\n";
cin>>choice;
}while((choice=='y')||(choice=='Y'));

return(0);
}

1

Решение

Не использовать получает

использование cin.getline() вместо getsвезде, где вы используете gets,

cin.getline(department, sizeof department);

gets устарел, из-за опасности переполнения буфера, так как размер ввода не может быть указан.

Избавление от нежелательных новых строк

В твоем случае, gets использовал (не пропущенный) символ новой строки из предыдущего ввода и, следовательно, сохранял пустой символ *. использование cin.ignore() чтобы избавиться от ненужных мест — это понадобится вам при использовании getline() тоже.

Кроме того, вы всегда можете использовать cin.getline() читать пользовательский ввод в согласованном порядке, а затем проанализировать ввод в зависимости от типа данных, которые вы ожидаете. Это также позволит вам выполнять намного лучшую проверку ошибок.

2

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

Вы смешиваете C и C ++. Конечно, это разрешено, но есть нечто, называемое идиоматическим способом использования языка; Это означает, что у пользователей языка есть естественный способ выразить конструкции элегантным способом. Два места, где я бы предложил изменить:

  1. использование std::stringс вместо char массивы; std::string department;
  2. использование std::getline(std::cin, department);

Массивы известны тем, что являются богатым источником ошибок. Оставьте такое низкоуровневое управление памятью доступным стандартным средствам библиотеки.

0

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