Все функции выполняются строго в том порядке, в котором вы их прописали. Другое дело, что сообщение, выводимое первым printf ( ) может появляться позже, чем, собственно, чтение fgets ( ).
Связано это с тем, что printf ( ) пишет строку в поток stdout, который использует
построчный буферезированный вывод. Т.е. печать на терминал фактически осуществляется когда встречается символ новой строки.
Это поведение можно изменить с помощью функции
setvbuf ( ).
В вашем случае также можно просто использовать fflush ( stdout ) для принудительной записи содержимого буфера в поток.