4

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

4

4 回答 4

6

使用更简单的替代方案。std::char_traits::length很棒,但对于 C 字符串,它的作用相同,而且代码要长得多。

帮自己一个忙,避免代码臃肿。我是 C++ 函数的忠实粉丝,而不是 C 等效函数(例如,我永远不会使用std::strcpyor std::memcpy,完全可以std::copy)。但回避std::strlen只是愚蠢的。

专门使用 C++ 函数的一个原因是接口统一性:例如,两者都std::strcpy具有std::memcpy恶劣的接口。然而,std::strlen在 C++ 的最佳传统中,它是一个完美的算法。它没有概括,真的,但标准库中的其他特定于类的自由函数也没有。

于 2013-10-25T20:49:34.957 回答
3

std::strlen()是来自 C 标准库的保留,并且仅对 a 进行操作const char*(如果字符串不是以空值终止的,它具有未定义的行为是不安全的)。如果字符串使用的是宽字符集(例如const unsigned short*),std::strlen()则无用。

std::char_traits<T>::length()将对任何T类型进行操作(例如,如果它是 an unsigned short,它仍然可以正常运行,但还需要一个以 null 结尾的值 - 即最后一个值必须是T(0)- 如果传递给它的 ' 数组T不是以 null 结尾的,行为也未定义)。

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

于 2013-10-25T20:32:19.397 回答
0

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

于 2013-10-28T09:59:34.027 回答
-2

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

strlen(mystring.c_str())

这比mystr.length(). 除此之外,应该没有明显的区别(char即类型)。

于 2013-10-25T20:30:59.863 回答