这两种方法都是等价的,因为它们返回的是以null结尾的字符序列的长度。
djmepvbi1#
使用更简单的替代方案。std::char_traits::length是伟大的,但对于C字符串,它做了相同的,并且代码更长。帮你自己一个忙,避免代码膨胀。我是C函数的超级粉丝,而不是C等效函数(例如,我永远不会使用std::strcpy或std::memcpy,有一个完美的std::copy)。但是避免std::strlen只是愚蠢的。专门使用C函数的一个原因是接口一致性:例如,std::strcpy和std::memcpy都有很糟糕的接口。然而,std::strlen是C++最好的传统中的一个完美的算法。它没有泛化,真的,但是在标准库中找到的其他类特定的自由函数也没有。
std::char_traits::length
std::strcpy
std::memcpy
std::copy
std::strlen
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风格的字符串。
std::strlen()
const char*
const unsigned short*
std::char_traits<T>::length()
T
unsigned short
T(0)
std::string::length()
muk1a3rh3#
扎克·豪兰和康拉德·鲁道夫都说得有道理。谢谢。我接受两个答案。概括的回答是:除了个人偏好之外,似乎没有任何关于更短代码或C++标准库的偏好(我省略了泛化,因为它不是问题的重点,从标题中可以看出)。
kzipqqlq4#
由于C++17,std::char_traits<char>::length()是constexpr,这意味着如果可能的话,它应该在编译时计算(即如果参数是常量)。在实践中,现代编译器已经优化了strlen,以便在编译时也为constexpr表达式计算字符串长度,尽管这并不是真正的标准。话虽如此,我同意strlen更具可读性。
std::char_traits<char>::length()
constexpr
strlen
mwecs4sa5#
std::strlen()是一个C标准库兼容性函数(尽管它是ISO C++的一部分),它接受const char*作为参数。length()是std::string类家族的一个方法。所以如果你想在std::string上使用strlen(),你必须写:
length()
std::string
strlen()
strlen(mystring.c_str())
除此之外,应该没有明显的区别(对于char类型)。
char
5条答案
按热度按时间djmepvbi1#
使用更简单的替代方案。
std::char_traits::length
是伟大的,但对于C字符串,它做了相同的,并且代码更长。帮你自己一个忙,避免代码膨胀。我是C函数的超级粉丝,而不是C等效函数(例如,我永远不会使用
std::strcpy
或std::memcpy
,有一个完美的std::copy
)。但是避免std::strlen
只是愚蠢的。专门使用C函数的一个原因是接口一致性:例如,
std::strcpy
和std::memcpy
都有很糟糕的接口。然而,std::strlen
是C++最好的传统中的一个完美的算法。它没有泛化,真的,但是在标准库中找到的其他类特定的自由函数也没有。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风格的字符串。muk1a3rh3#
扎克·豪兰和康拉德·鲁道夫都说得有道理。谢谢。我接受两个答案。概括的回答是:除了个人偏好之外,似乎没有任何关于更短代码或C++标准库的偏好(我省略了泛化,因为它不是问题的重点,从标题中可以看出)。
kzipqqlq4#
由于C++17,
std::char_traits<char>::length()
是constexpr
,这意味着如果可能的话,它应该在编译时计算(即如果参数是常量)。在实践中,现代编译器已经优化了
strlen
,以便在编译时也为constexpr
表达式计算字符串长度,尽管这并不是真正的标准。话虽如此,我同意
strlen
更具可读性。mwecs4sa5#
std::strlen()
是一个C标准库兼容性函数(尽管它是ISO C++的一部分),它接受const char*
作为参数。length()
是std::string
类家族的一个方法。所以如果你想在std::string
上使用strlen()
,你必须写:除此之外,应该没有明显的区别(对于
char
类型)。