char str1[5];
char str2[3];
fgets(str1,5,stdin);
fgets(str2,3,stdin);
Я ожидаю, что при запуске введу слово из 5 букв, потом слово из 3
Чтение
man fgets легко отвечает на этот вопрос:
fgets() reads in at most one less than size characters from stream
and stores them into the buffer pointed to by s.
Reading stops after an EOF or a newline.
If a newline is read, it is stored into the buffer.
Т.е. чтобы прочитать ровно 5 и ровно 3 символа, нужно вызывать fgets с аргументом размера 6 и 4 соответственно. Кроме того, когда первая строка заканчивается символом конца строки, этот символ тоже должен быть считан. Т.е. 7 и 5.