C 字符串的长度:std::strlen() vs. std::<char>char_traits::length()
Length of a C string: std::strlen() vs. std::char_traits<char>::length()
两者都是等效的,因为它们返回以空结尾的字符序列的长度。是否有理由偏爱一个而不是另一个?
使用更简单的替代方法。 std::char_traits::length
很棒,但对于 C 字符串,它做同样的事情,并且代码要长得多。
帮自己一个忙,避免代码膨胀。我是 C 等效函数的忠实粉丝C++(例如,我永远不会使用 std::strcpy
或 std::memcpy
,有一个非常好的std::copy
)。但避免std::strlen
只是愚蠢的。
专门使用C++函数的一个原因是接口一致性:例如,std::strcpy
和std::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
类型,也就是说)。
- 将无符号char*转换为std::istream*C++
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- std::string 构造函数如何处理固定大小的 char[]?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- C++:将模板类型 char 转换为 std::string
- 有效地将数据加载到 std::vector 中<char>
- 为什么 char 可以在 std::array 中初始化为 nullptr,而不是单独初始化?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- 未定义模板"std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator&
- 获取未知分段错误"(地址)在 std::__cxx11::basic_string<char, std::char_traits<char>,..., std::分配器<cha
- 如何创建 std::vector of char/std::byte,其中第一个字节对齐到 16 个字节,但没有填充
- C++和Visual Studio错误 - 不存在从"std::basic_ostream<char, std::char_traits<char>>"到"int"的合适转换功
- 将 std::vector 的一部分转换为<char> std::array<char, n>, c++11
- 错误:与 std::operator<< <std::char_traits<char> >(*&std::cout),((常量字符*)中的运算符<<不