strnlen如何在C ++中工作?

时间:2014-02-03 19:32:28

标签: c++ string

我很困惑strnlen如何在C ++中使用非空终止的字符串,因为我不确定它是如何计算大小的。 strlen实施很简单:

size_t strlen(char *s)
{
    size_t sz;
    while(*s++ != '\0')
    {
        ++sz;
    }
    return sz;
}

但您如何实施strnlen()

5 个答案:

答案 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)

略短于πάντα ῥεῖ's answer

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;
}