strnlen()如何在C 中起作用

How does strnlen() internally work in C++?

本文关键字:起作用 strnlen      更新时间:2023-10-16

我很困惑strnlen如何在C 中使用未终止的字符串,因为我不确定它如何计算大小。

strlen()实现很容易:

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

但是您将如何实现strnlen()

比πάνταῥεῖ的答案短一点:

size_t strnlen(const char * s, size_t len) {
    size_t i = 0;
    for ( ; i < len && s[i] != ''; ++i);
    return i;
}

编辑:

为将来的读者和可能的下降者澄清,当我写这个答案时,我的代码实际上较短。现在已经不复存在了,因为其他帖子已编辑。我认为这不应该是降低我的原因。

但是您将如何实现strnlen()

这样:

size_t strnlen(const char *s, size_t max_len)
{
    size_t i = 0;
    for(; (i < max_len) && s[i]; ++i);
    return i;
}

strnlen == min(n, strlen)

例如。而不是

while(*s++ != '')

使用

for(int i = 0; i < n && *s++ != ''; i++)

或任何等效。

将来,请随时阅读来源,我刚刚通过谷歌搜索" strnlen源代码"找到了源。

您的代码无效,因为变量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 );

但是您将如何实施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;
}