C++ C字符串的长度:std::strlen()与std::char\u traits<;char>;::长度()

C++ C字符串的长度:std::strlen()与std::char\u traits<;char>;::长度(),c++,C++,两者都是等效的,因为它们返回以null结尾的字符序列的长度。是否有理由选择一个而不是另一个?std::strlen()是一个C标准库兼容性(即使它是ISO C++的一部分)函数,它以const char*作为参数length()是std::string类族的一种方法。因此,如果您想在std::string上使用strlen(),您必须编写: strlen(mystring.c_str()) 它不如mystr.length()整洁。除此之外,应该没有明显的区别(也就是说,对于char类型)。st

两者都是等效的,因为它们返回以null结尾的字符序列的长度。是否有理由选择一个而不是另一个?

std::strlen()
是一个C标准库兼容性(即使它是ISO C++的一部分)函数,它以
const char*
作为参数
length()
std::string
类族的一种方法。因此,如果您想在
std::string
上使用
strlen()
,您必须编写:

strlen(mystring.c_str())
它不如mystr.length()整洁。除此之外,应该没有明显的区别(也就是说,对于
char
类型)。

std::strlen()
是C标准库的保留,只对
const char*
进行操作(如果字符串不是以null结尾,则它具有未定义的行为,这是不安全的)。如果字符串使用宽字符集(例如
const unsigned short*
),则
std::strlen()
无效

std::char\u traits::length()
将对
T
类型的任何类型进行操作(例如,如果它是
无符号短码
,它仍将正常工作,但还需要以空结尾的值-即最后一个值必须是
T(0)
-如果传递给它的
T
数组未以null结尾,则行为也未定义)


通常,在处理字符串时,最好使用
std::string::length()
而不是使用C样式的字符串。

使用更简单的替代方法
std::char\u traits::length
非常棒,但对于C字符串来说,它与std::char\u traits::length一样,而且代码更长

帮自己一个忙,避免代码膨胀。在C++等价的C++函数中,我是一个巨大的迷(例如,我将<强>绝对/不强>使用<代码> STD::StrucP或 STD::MimcPy,有一个非常好的<代码> STD::但是避免std::strlen是愚蠢的


<> P>使用C++函数的一个原因是接口的一致性:例如, > STD::StrucP和 STD::MimCPy 具有很强的接口。然而,<>代码:STRLEN <代码>是C++最佳传统的完美算法。它不是泛化的,没错,但标准库中其他特定于类的自由函数也是如此。

Zack Howland和Konrad Rudolph都有自己的观点。谢谢我接受两个答案。简要答复如下:
除了个人偏好之外,对于短代码或C++标准库,似乎没有任何其他的(我不在一般化,因为它不是标题的问题,如标题所见)。< / P>第二个版本使用标准的C++头<代码> <代码>,而第一个使用C标题<代码> <代码>。我总是喜欢避免。(当然,很棒)C函数如果有C++的替代。@(如果你是C++编程的,当然)<代码> STD::字符长度:(长度(cont t*t)< /COD>不是 STD::String 的一部分。它是代码< STD:CARLY特性< /代码>的一部分。这就是我说的“家庭”的意思。由std::string组成的类。那么,这个措辞可能不是您想要表达的。
std::string
使用
std::char\u traits
(像iostreams这样的其他std类也是如此),但
std::char\u traits
std::string
一无所知。事实上,
std::string::length
甚至不查找空终止符(它返回
size
成员的值)。
std::char\u traits::length()
确实在寻找空终止符。不,你误解了OP。除此之外,
std::strlen
std::basic_string::length
之间有着明显的区别。前者假设字符串以空结尾,后者允许字符串中包含空字符。你应该总是害怕在上使用
strlen
de>string::c_str()有时会由于字符串中的
\0
而报告错误的长度。如果将以非空结尾的字符序列传递给
char\u traits::length()
,这也是未定义的行为。@Ruup True。我忽略了这一点,因为我认为这是不言自明的,但为了完整性,我将添加它。好吧,这并不完全愚蠢(如果您不能保证字符串中有空终止符),但您可以使用
strnlen
解决这个问题。如果您必须支持不同大小的字节集(例如,UNICODE的构建和非UNICODE的构建),char\u traits版本更有用。@Zac Well,(显然)我在谈论上述备选方案之间的直接比较。点击添加太快…我的想法还没有结束,你已经回答:)