我很困惑strnlen
如何在C ++中使用非空终止的字符串,因为我不确定它是如何计算大小的。 strlen
实施很简单:
size_t strlen(char *s)
{
size_t sz;
while(*s++ != '\0')
{
++sz;
}
return sz;
}
但您如何实施strnlen()
?
答案 0 :(得分:8)
但您如何实施
strnlen()
?
像这样:
size_t strnlen(const char *s, size_t max_len)
{
size_t i = 0;
for(; (i < max_len) && s[i]; ++i);
return i;
}
答案 1 :(得分:8)
size_t strnlen(const char * s, size_t len) {
size_t i = 0;
for ( ; i < len && s[i] != '\0'; ++i);
return i;
}
编辑:
为了澄清未来的读者和可能的挫折者,当我写这个答案时,我的代码实际上更短。现在已经没有了,因为另一篇文章已被编辑。我不认为这应该是我投票的理由。
答案 2 :(得分:2)
strnlen == min(n, strlen)
e.g。而不是
while(*s++ != '\0')
使用
for(int i = 0; i < n && *s++ != '\0'; i++)
或任何等同物。
将来,feel free to read the source yourself,我通过谷歌搜索“strnlen源代码”找到了。
答案 3 :(得分:1)
您的代码无效,因为变量sz未初始化
size_t sz;
我认为这只是一个错字。
此参数也应定义为const char *s
strnlen
不是C ++标准函数。它仅在C中定义。它可以通过以下方式定义
size_t strnlen( const char *s, size_t n )
{
size_t i = 0;
while ( i < n && s[i] ) ++i;
return i;
}
在C ++中,可以声明它具有默认参数
size_t strnlen( const char *s, size_t n = -1 );
答案 4 :(得分:1)
但是你如何实现strnlen?
你真的不需要在C ++中,只需使用std::find
就好了。
auto length = std::find(s, s + max_len, 0) - s;
或者如果你想将它包装在模板函数中,那么它也可以使用多个单字节字符。
template<type Type>
size_t strnlen(const Type* s, size_t max_len)
{
return std::find(s, s + max_len, 0) - s;
}