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;

Другие вопросы по тегам