std::string::length()与size()完全等价,均返回字符个数;比较时需防隐式转换陷阱,空字符串用empty()判断,超长检查应定义常量上限。

用 std::string::length() 或 std::string::size() 获取长度
这两个函数完全等价,都返回 size_t 类型的无符号整数,表示字符个数(不是字节数,对 UTF-8 多字节字符也只算 1)。直接比较即可:
std::string s = "hello";
if (s.length() >= 5 && s.length() <= 10) {
// 长度在 5~10 之间(含)
}注意:size_t 是无符号类型,如果和负数比较(比如 s.length() > -1),会触发隐式转换,-1 变成极大正数,条件恒为 false —— 这是常见误判点。
判断空字符串或超长时的边界处理
实际校验常需覆盖边界情况,比如不允许为空、有最大长度限制。别只写 s.length() == 0,用更直观的 s.empty();超长检查建议显式写出上限值,避免魔法数字:
- 空检查优先用
s.empty(),语义清晰且不涉及类型转换 - 最大长度建议定义常量,如
constexpr size_t MAX_NAME_LEN = 32;,再写s.length() - 若从 C 风格字符串(
const char*)构造std::string后校验,要意识到构造本身不验证长度,仍需手动检查
处理 C 字符串或原始指针时别直接用 strlen
如果输入是 const char* s,且不确定是否以 '<p>如果输入是 <code>const char* s,且不确定是否以 '\0' 结尾,调用 strlen(s) 会越界读取,导致未定义行为。此时应:
strlen(s) 会越界读取,导致未定义行为。此时应:
立即学习“C++免费学习笔记(深入)”;
- 明确知道来源安全(如编译期字符串字面量),才用
strlen - 否则改用带长度参数的接口,例如
std::string_view(s, known_len),再调用.length() - 或用
strnlen(s, max_size)(POSIX)加兜底,但注意它不是标准 C++ 函数
中文或 UTF-8 字符串的“长度”陷阱
std::string::length() 返回的是字节数,不是 Unicode 码点数。对 UTF-8 编码的中文,一个汉字占 3 字节,"你好".length() 是 6,不是 2。如果业务要求“最多 10 个汉字”,就不能直接用 length() 比较:
- 需要 UTF-8 解码计数,可用
std::from_chars(C++17 起支持部分编码)或轻量库如utf8cpp - 简单场景可先转
std::u32string:std::wstring_convert<:codecvt_utf8>, char32_t>{}.from_bytes(s).length()</:codecvt_utf8>(注意该 API 已被弃用,仅作示意) - 更稳妥的做法是:明确协议层约定——校验按字节还是按字符;多数网络协议、数据库字段限制其实都是按字节,这时
length()反而是对的
没搞清“长度”定义就动手写判断逻辑,后面调试时容易卡在奇怪的截断或拒绝问题上。


















