Одна почти оптимальная реализация:
size_t memcspan(const unsigned char *buf, size_t len, const unsigned char *set, size_t n)
{
size_t i;
char set2[1<<CHAR_BIT] = {0};
while (n--) set2[set[n]] = 1;
for (i=0; i<len && !set2[buf[i]]; i++);
return i;
}
Возможно, лучше использовать битовый массив вместо байтового массива для set2
, в зависимости от того, чем больше арифметическое или немного больше кешадорого на твоей машине.