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

Length of a C string: std::strlen() vs. std::char_traits<char>::length()

本文关键字:char std gt 字符串 traits length lt vs strlen      更新时间:2023-10-16

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

使用更简单的替代方法。 std::char_traits::length很棒,但对于 C 字符串,它做同样的事情,并且代码要长得多。

帮自己一个忙,避免代码膨胀。我是 C 等效函数的忠实粉丝C++(例如,我永远不会使用 std::strcpystd::memcpy,有一个非常好的std::copy)。但避免std::strlen只是愚蠢的。

专门使用C++函数的一个原因是接口一致性:例如,std::strcpystd::memcpy都有糟糕的接口。但是,std::strlen是C++的最佳传统中完美的算法。它不是泛化的,是的,但在标准库中找到的其他特定于类的自由函数也是如此。

> 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 样式的字符串。

Zack Howland和Konrad Rudolph都有道理。谢谢。我接受这两个答案。摘要答复如下:除了个人对较短代码或C++标准库的偏好之外,似乎没有任何内容(我省略了概括,因为从标题中可以看出这不是问题的重点)。

自 C++17 以来,std::char_traits<char>::length() constexpr意味着如果可能的话,它应该在编译时计算(即,如果参数是常量)。

在实践中,现代编译器已经优化了strlen,以便在编译时为constexpr表达式计算字符串长度,即使它不是真正的标准。

话虽如此,我同意strlen更具可读性。

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

strlen(mystring.c_str())

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

相关文章: