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