As a general purpose string library
rapidstring looks promising. It emulates the ease of std::string for C while being a lot faster at it. But it doesn't have contains/split etc (doesn't need to).
As to C not having contains/split, that is not necessarily true, it is just that the standard library of C doesn't have the most user friendly interface. You should look into the standard header string.h and its use case.
"Find" is
strstr.
"Find a single char" is
strchr.
"Find any of" is
strpbrk.
"Find first not of" is kindof
strspn, like this
| str + strspn(str, " \t\v\f\r\n")
|
It would skip all whitespace.
"Contains" is just checking
| strstr(haystack, needle) != NULL
|
Split is
strtok. Not the best api for splitting, but it works. You can implement splitting easily with strspn/strpbrk too.
What the C libraries don't have is a way to reverse search most of the time. Like a way to find the last occurence of X in a str. The reason probably is, that there is no straightforward interface for such a function, since you would have to pass the length of the string into the function.