这个 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:while(*c1++);
--> while(*c1) c1++;
"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;
"should typecast to size_t before returning"。 return (size_t) (c1 - c);
是一个好主意,因为指针差异是 ptrdiff_t
类型(有符号整数类型),而 size_t
是无符号整数类型。这会消除诸如 gcc -Wsign-conversion
之类的警告
"missing NULL check for c" 不需要,因为 strlen(const char* c)
需要指向字符串的指针,而 NULL
不是指向字符串的指针。
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:
while(*c1++);
-->while(*c1) c1++;
"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;
"should typecast to size_t before returning"。
return (size_t) (c1 - c);
是一个好主意,因为指针差异是ptrdiff_t
类型(有符号整数类型),而size_t
是无符号整数类型。这会消除诸如 gcc -Wsign-conversion 之类的警告
"missing NULL check for c" 不需要,因为
strlen(const char* c)
需要指向字符串的指针,而NULL
不是指向字符串的指针。