I wrote my own version of `endswith` just like in high-level programming languages in C which I would like reviews on. There are 2 versions. One is my own and the other is from [ccan][1]. For some reason, I feel that [ccan][1]'s version is better than mine until proven wrong. [ccan][1]/str's version: static inline bool strends(const char *str, const char *postfix) { if (strlen(str) < strlen(postfix)) return false; return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0; } My version: bool strends(const char *str, const char *postfix) { register const char *end = str + strlen(str) - 1; register const char *epostfix = postfix + strlen(postfix) - 1; while (end > str && postfix > epostfix) if (*end-- != *epostfix--) return false; return true; } I wonder which one is better and why (in terms of readability, performance and so on). Please be specific and provide your research if possible. Thanks in advance. [1]: https://github.com/rustyrussell/ccan/