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() <p>注意:<code>size_t</code> 是无符号类型,如果和负数比较(比如 <code>s.length() > -1</code>),会触发隐式转换,-1 变成极大正数,条件恒为 false —— 这是常见误判点。</p><h3>判断空字符串或超长时的边界处理</h3><p>实际校验常需覆盖边界情况,比如不允许为空、有最大长度限制。别只写 <code>s.length() == 0</code>,用更直观的 <code>s.empty()</code>;超长检查建议显式写出上限值,避免魔法数字:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2823" title="C++14"><img src="https://img.php.cn/upload/manual/001/431/639/6ac8b33c327c4749.png" alt="C++14" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="overflowclass">C++14</a> <p class="overflowclass">C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。</p> </div> <a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- 空检查优先用
s.empty(),语义清晰且不涉及类型转换 - 最大长度建议定义常量,如
constexpr size_t MAX_NAME_LEN = 32;,再写s.length() - 若从 C 风格字符串(
const char*)构造std::string后校验,要意识到构造本身不验证长度,仍需手动检查
处理 C 字符串或原始指针时别直接用 strlen
如果输入是 const char* s,且不确定是否以 '\0' 结尾,调用 strlen(s) 会越界读取,导致未定义行为。此时应:
- 明确知道来源安全(如编译期字符串字面量),才用
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()反而是对的
没搞清“长度”定义就动手写判断逻辑,后面调试时容易卡在奇怪的截断或拒绝问题上。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










