Как насчет:
#define SPACE " \t"
const char *advance_buf(const char *buf, char *removed_chars, int size)
{
buf += sprintf(removed_chars, "%.*s", min(size - 1, strcspn(buf, SPACE)), buf);
return buf + strspn(buf, SPACE);
}
Примечание: если заполнится removed_chars
, лишние символы не будут удалены из buf
.
const char *buf = "123 456789 X"
char removed_chars[5];
// Before: buf: "123 456789 X", removed_chars: (empty).
buf = advance_buf(buf, removed_chars, sizeof (removed_chars));
// After: buf: "456789 X", removed_chars: "123".
buf = advance_buf(buf, removed_chars, sizeof (removed_chars));
// After: buf: "89 X", removed_chars: "4567".
Примечание 2. Хотя вызов sprintf
безопасен, поскольку "%.*s"
защищает от переполнения буфера, некоторые современные компиляторы генерируют предупреждения для любого использования sprintf()
, а некоторые стандарты кодирования компании запрещают его. Если так, то это должно быть тривиально заменить snprintf
или sprintf_s
.