%s
соответствует только без пробелов. Вы хотите %[…]
или, что еще лучше, %c
(позаботьтесь о том, чтобы добавить конечный NUL самостоятельно).
Кроме того, %*d
будет сканировать цифру, но не сохранит ее, что, я думаю, вы бы предпочли (поскольку у вас уже есть namelen
ранее).
Но в целом я бы, вероятно, избегал генерации строки формата во время выполнения.
int namelen, offset;
char name[BUFFSIZE];
char flags[BUFFSIZE];
char mode[20];
sscanf(buff, "O %d %n", &namelen, &offset);
memcpy(name, buff + offset, namelen);
name[namelen + 1] = '\0';
sscanf(buff + offset + namelen, " %s %s", flags, mode);
(Не проверено, но что-то подобное должно работать.)