这个 strlen() 实现有什么问题?

Whats wrong with this strlen() implementation?

size_t strlen(const char* c)
{
  auto *c1 = c;
  while(*c1++);
  return c1 - c;
}

我能找到的错误:
* 缺少 c
的 NULL 检查 * c1 应该被声明为 char 指针(或者它是必需的?)
* 在返回

之前应该转换为 size_t

看来您的答案总是比应有的答案多 1 个。您需要减去 1 或 return c1 - c - 1;

  1. 关闭 1:while(*c1++); --> while(*c1) c1++;

  2. "c1 should be declared as char pointer (or is it required?)" 我会用 const char *c1 = c;。需要检查 auto *c1 = c; 在 C11 中是否正常。
    [编辑] 看不到 auto 在 C11 中也有效。推荐const char *c1 = c;

  3. "should typecast to size_t before returning"。 return (size_t) (c1 - c); 是一个好主意,因为指针差异是 ptrdiff_t 类型(有符号整数类型),而 size_t 是无符号整数类型。这会消除诸如 gcc -Wsign-conversion

  4. 之类的警告
  5. "missing NULL check for c" 不需要,因为 strlen(const char* c) 需要指向字符串的指针,而 NULL 不是指向字符串的指针。