c++ C字符串的长度:std::strlen()vs. std::char_traits< char>::length()

pinkon5k  于 2023-04-08  发布在  其他
关注(0)|答案(5)|浏览(187)

这两种方法都是等价的,因为它们返回的是以null结尾的字符序列的长度。

djmepvbi

djmepvbi1#

使用更简单的替代方案。std::char_traits::length是伟大的,但对于C字符串,它做了相同的,并且代码更长。
帮你自己一个忙,避免代码膨胀。我是C函数的超级粉丝,而不是C等效函数(例如,我永远不会使用std::strcpystd::memcpy,有一个完美的std::copy)。但是避免std::strlen只是愚蠢的。
专门使用C
函数的一个原因是接口一致性:例如,std::strcpystd::memcpy都有很糟糕的接口。然而,std::strlen是C++最好的传统中的一个完美的算法。它没有泛化,真的,但是在标准库中找到的其他类特定的自由函数也没有。

nx7onnlm

nx7onnlm2#

std::strlen()是C标准库中的一个保留,只对const char*进行操作(如果字符串不是以null结尾,则它具有未定义的行为,这是不安全的)。如果字符串使用宽字符集(例如const unsigned short*),则std::strlen()是无用的。
std::char_traits<T>::length()将对任何T类型进行操作(例如,如果它是unsigned short,它仍然可以正常操作,但也需要一个null终止值-即最后一个值必须是T(0)-如果传递给它的T数组不是null终止的,行为也是未定义的)。
一般来说,在处理字符串时,最好使用std::string::length(),而不是使用C风格的字符串。

muk1a3rh

muk1a3rh3#

扎克·豪兰和康拉德·鲁道夫都说得有道理。谢谢。我接受两个答案。概括的回答是:除了个人偏好之外,似乎没有任何关于更短代码或C++标准库的偏好(我省略了泛化,因为它不是问题的重点,从标题中可以看出)。

kzipqqlq

kzipqqlq4#

由于C++17,std::char_traits<char>::length()constexpr,这意味着如果可能的话,它应该在编译时计算(即如果参数是常量)。
在实践中,现代编译器已经优化了strlen,以便在编译时也为constexpr表达式计算字符串长度,尽管这并不是真正的标准。
话虽如此,我同意strlen更具可读性。

mwecs4sa

mwecs4sa5#

std::strlen()是一个C标准库兼容性函数(尽管它是ISO C++的一部分),它接受const char*作为参数。length()std::string类家族的一个方法。所以如果你想在std::string上使用strlen(),你必须写:

strlen(mystring.c_str())

除此之外,应该没有明显的区别(对于char类型)。

相关问题