Дело в том, как scanf и fgets обрабатывают символ новой строки.
fgets в отличие от scanf принимает знак новой строки как валидный символ и копирует его вместе со всеми остальными введенными данными в переменную.
scanf же оставляет этот символ в буфере.
Поэтому когда Вы вызваете fgets после scanf он сразу получает на входе символ новой строки и заканчивает считывать данные
выберите себе один способ ввода данных и не мешайте их.
вот доки на fgets
cstdio/fgets