C++ C字符串的长度:std::strlen()与std::char\u traits<;char>;::长度()
两者都是等效的,因为它们返回以null结尾的字符序列的长度。是否有理由选择一个而不是另一个?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
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或<> P>使用C++函数的一个原因是接口的一致性:例如,
除了个人偏好之外,对于短代码或C++标准库,似乎没有任何其他的(我不在一般化,因为它不是标题的问题,如标题所见)。< / P>第二个版本使用标准的C++头<代码> <代码>,而第一个使用C标题<代码> <代码>。我总是喜欢避免。(当然,很棒)C函数如果有C++的替代。@(如果你是C++编程的,当然)<代码> STD::字符长度:(长度(cont t*t)< /COD>不是
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,(显然)我在谈论上述备选方案之间的直接比较。点击添加太快…我的想法还没有结束,你已经回答:)