Смотрим документацию по
getchar.
Она читает ровно ОДИН символ из стандартного входного потока.
Код этого символа записывается в переменную
c.
Если это специальный код
EOF, то происходит выход из цикла.
Если нет, то функция
tolower возвращает код для буквы нижнего регистра, если был верхний регистр (или возращает без изменения, если это не была буква верхнего регистра).
Функция
putchar посылает этот символ в стандартный выходной поток.
Потом следующая итерация цикла и т.д.