Im not sure about what "better version" means, but my guess would be a faster or more reliable version. If that's the case:
> for (int i = 0; i < strlen(source); i++) {
Since you're going on ebyte at a time, there's no need to know how big the array is. As a stopping condition you could use source[i] != '\0', which is one less pass through the array.
One other optimization that could be done (but is a bigger headache to implement correctly) would be to cast the char* into uint64_t* (or uint32_t* for 32-bit systems) and copy more bytes at a time. The headache comes from finding a 0 in this longer variable,
but you can probably use a similar strategy to freebsd's strlen (
https://github.com/freebsd/freebsd-src/blob/main/lib/libc/string/strlen.c).
I'm not sure if it would be a real speedup in most cases, since glibc can use this strategy already), but at least we'd have consistent performance in case some system doesn't use it