C字符串的长度:std :: strlen()与std :: char_traits <char> :: length()</char>

时间:2013-10-25 20:26:24

标签: c++

两者都是等价的,因为它们返回以null结尾的字符序列的长度。是否有理由选择彼此?

4 个答案:

答案 0 :(得分:5)

使用更简单的替代方案。 std::char_traits::length非常棒,但是对于C字符串,它确实相同并且代码更长。

帮自己一个忙,避免代码臃肿。我是C ++函数的忠实粉丝而不是C等价物(例如,我从不使用std::strcpystd::memcpy,这是完全正常的std::copy)。但是避免std::strlen只是愚蠢。

仅使用C ++函数的一个原因是接口一致性:例如,std::strcpystd::memcpy都有非常严重的接口。但是,std::strlen是一个完美的C ++最佳传统算法。它没有概括,但是在标准库中找不到其他类特定的自由函数。

答案 1 :(得分:3)

std::strlen()是来自C标准库的保留,仅在const char*上运行(如果字符串未终止,则它具有未定义的行为是不安全的)。如果字符串使用宽字符集(例如const unsigned short*),则std::strlen()无用。

std::char_traits<T>::length()将对T类型的任何内容进行操作(例如,如果它是unsigned short,它仍将正常运行,但也需要空终止值 - 这是最后一个value必须为T(0) - 如果传递给它的T数组未终止,则行为也是未定义的。)

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

答案 2 :(得分:0)

Zack Howland和Konrad Rudolph都有一个观点。谢谢。我接受这两个答案。总结的答复是: 对于较短的代码或C ++标准库,似乎没有任何个人偏好(我省略了概括,因为从标题中可以看出它不是问题的重点)。

答案 3 :(得分:-2)

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

strlen(mystring.c_str())

mystr.length()更整洁。除此之外,应该没有明显的区别(对于char类型,那就是)。