两者是等效的,因为它们返回以空字符结尾的字符序列的长度。是否有偏爱其中一个的理由?
4 回答
使用更简单的替代方案。std::char_traits::length
很棒,但对于 C 字符串,它的作用相同,而且代码要长得多。
帮自己一个忙,避免代码臃肿。我是 C++ 函数的忠实粉丝,而不是 C 等效函数(例如,我永远不会使用std::strcpy
or std::memcpy
,完全可以std::copy
)。但回避std::strlen
只是愚蠢的。
专门使用 C++ 函数的一个原因是接口统一性:例如,两者都std::strcpy
具有std::memcpy
恶劣的接口。然而,std::strlen
在 C++ 的最佳传统中,它是一个完美的算法。它没有概括,真的,但标准库中的其他特定于类的自由函数也没有。
std::strlen()
是来自 C 标准库的保留,并且仅对 a 进行操作const char*
(如果字符串不是以空值终止的,它具有未定义的行为是不安全的)。如果字符串使用的是宽字符集(例如const unsigned short*
),std::strlen()
则无用。
std::char_traits<T>::length()
将对任何T
类型进行操作(例如,如果它是 an unsigned short
,它仍然可以正常运行,但还需要一个以 null 结尾的值 - 即最后一个值必须是T(0)
- 如果传递给它的 ' 数组T
不是以 null 结尾的,行为也未定义)。
一般来说,在处理字符串时,最好使用std::string::length()
而不是使用 C 风格的字符串。
Zack Howland 和 Konrad Rudolph 都有自己的观点。谢谢。我接受这两个答案。总结的答复是:除了个人偏好之外,似乎没有任何偏好,无论是更短的代码还是 C++ 标准库(我省略了概括,因为从标题中可以看出这不是问题的重点)。
std::strlen()
是作为参数的 C 标准库兼容性(即使它是 ISO C++ 的一部分)函数const char*
。是类族的length()
一种方法。std::string
因此,如果你想使用strlen()
onstd::string
你必须写:
strlen(mystring.c_str())
这比mystr.length()
. 除此之外,应该没有明显的区别(char
即类型)。