scanf cчитываeт входную строчку побайтово, постоянно сравнивая с заданным шаблоном и пытаясь распарсить. И пробелы, и конец строки - все подвергается анализу. Одна из самых больших функций в стандартной библиотеке.
fgets вообще простая - почти обычный while(c != 0) {c = fgetc();}