fgets() не принимает ввод
Я использую fgets(Learner.Name,21, STDIN) для ввода имени студента, но когда я запускаю программу, он показывает "Введите свое имя" и пропускает "Введите свои оценки по 5 предметам".
Может кто-нибудь объяснить мне, почему это происходит? Потому что это то же самое с функцией cin.getline().
Функция gets_s() не работает, компилятор показывает, что "gets_s" не был объявлен в этой области "
#include<iostream>
#include<stdio.h>
#include<cstdlib>
using namespace std;
struct Student
{
int rollno;
char name[21];
float marks[5];
char grade;
};
Student learner ;
int main()
{
cout<<"\n"<<"Enter Roll number: ";
cin>>learner.rollno;
cout<<"\n"<<"Enter your name: ";
fgets(learner.name,21,stdin);
cout<<"\n"<<"Enter your marks in 5 subjects: "<<"\n";
for(int i = 0;i <5;++i)
{
cout<<"\n"<<"Subject"<<i+1<<":";
cin>>learner.marks[i];
}
float avg ,total;
total = (learner.marks[0]+learner.marks[1]+learner.marks[2]+learner.marks[3]+learner.marks[4]);
avg = total/5;
if(avg<50)
learner.grade = 'D';
else if(avg<60)
learner.grade = 'C';
else if(avg<80)
learner.grade = 'B';
else
learner.grade = 'A';
cout<<"\n"<<"\n"<<"Student result: \n";
cout<<"Roll Number: "<<learner.rollno<<"\t";
cout<<"Name: ";
cout.write(learner.name,21);
cout<<"\n"<<"Total Marks: "<<total;
cout<<"\t"<<"Grade: "<<learner.grade<<endl;
system("pause");
return 0;
}
вот вывод:
Enter Roll number: 22
Enter your name:
Enter your marks in 5 subjects:
Subject1:
2 ответа
stdin
буфер не очищается после cin>>learner.rollno;
использовать getchar()
очистить / промыть stdin
буфер, а затем использовать cin.getline()
как
cin.getline(learner.name,'\n');
Причина в том, что когда вы набираете roll no и нажимаете enter, cin
читает только номер, а не перевод строки (это поведение по умолчанию). Эта новая строка остается во входном потоке, и когда вы выполняете fgets(), она принимает символ новой строки.
Чтобы изменить это, вы можете использовать cin >> noskipws >> learner.rollno;