std::string的length()和size()完全等价,均返回字符个数且底层调用同一函数;不可与C风格strlen()混淆,后者仅适用于以'\0'结尾的char*。

std::string 的 length() 和 size() 用法完全等价
对 std::string 对象,length() 和 size() 都返回字符个数(类型为 std::string::size_type),二者无任何区别,底层都是调用同一成员函数。C++ 标准明确要求它们行为一致。
常见误用是把它和 C 风格字符串的 strlen() 混淆 —— 后者只适用于以 '\0' 结尾的 char*,不能直接传 std::string 对象或其 c_str() 以外的指针。
std::string s = "hello"; std::cout << s.length(); // 输出 5 std::cout << s.size(); // 输出 5,完全一样
C 风格字符串必须用 strlen(),且参数必须是 const char*
strlen() 来自 ,它逐字节扫描直到遇到第一个 '\0',不检查缓冲区边界。传入非空终止字符串、野指针或 nullptr 会导致未定义行为(常见崩溃或随机大数)。
- ✅ 正确:
strlen(s.c_str())(s是std::string) - ❌ 错误:
strlen(s)(类型不匹配,编译失败) - ❌ 危险:
strlen(ptr),其中ptr可能为nullptr或未正确终止
#includeconst char* cstr = "world"; std::cout << strlen(cstr); // 输出 5
注意 std::string::length() 不等于字节数(UTF-8 场景下尤其关键)
如果字符串含中文、emoji 等 UTF-8 编码字符,length() 返回的是字节数,不是“用户感知的字符数”。例如 "你好" 在 UTF-8 下占 6 字节,length() 返回 6,但实际只有 2 个 Unicode 码点。
立即学习“C++免费学习笔记(深入)”;
没有标准库函数直接返回 Unicode 字符数;需用第三方库(如 ICU)或手动遍历 UTF-8 字节序列判断首字节模式。
-
"a"→length() == 1(ASCII,1 字节 = 1 字符) -
"你"→length() == 3(UTF-8 中一个汉字占 3 字节) -
"??"(ZWNJ 连接的 emoji)→length()可能为 12+,但逻辑字符数为 1
用 std::string_view 时同样调用 length(),但不拥有数据
std::string_view 是轻量视图,length() 返回其当前指向的字符数量(同样为字节数),不涉及内存分配或拷贝。它不保证底层数据以 '\0' 结尾,因此不能直接传给 strlen()。
- ✅ 安全:
sv.length(),sv.data()可用于只读访问 - ❌ 错误:
strlen(sv.data())—— 若sv不含结尾'\0',strlen会越界读取
std::string_view sv = "test"; std::cout << sv.length(); // 输出 4 // std::cout << strlen(sv.data()); // ❌ 危险:sv.data() 不一定以 '\0' 结尾
C++ 字符串长度计算本身很简单,真正容易出问题的地方在于混用不同字符串类型、忽略编码语义、以及对空终止假设的盲目依赖。尤其是把 std::string::length() 当作“字符数”用在国际化文本中,或者把 string_view::data() 直接喂给 C 函数,这两类错误在线上环境极难复现和调试。











