Эх. :)
Короче, то, что выше, - очистка буфера до начала новой строки. :) А вот
scanf("%[^\n]%*c",buf);
это аналог gets().
Дело в том, что формат %s читает ввод только до пробела. Если надо ввести и пробелы тоже, приходится идти обходным путем.
%[...]
- совпадение по маске из перечисленных символов
%[^...]
- совпадение по всем символам, КРОМЕ перечисленных
%*...
- прочесть, но игнорировать.
В итоге такой формат приводит к тому, что scanf читает из входа все, кроме \n (перевода строки) и складывает в переменную. Потом читает и \n, чтобы очистить буфер, но игнорирует его.