c++中如何计算字符串的长度_c++获取字符串长度函数

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())sstd::string
  • ❌ 错误:strlen(s)(类型不匹配,编译失败)
  • ❌ 危险:strlen(ptr),其中 ptr 可能为 nullptr 或未正确终止
#include 
const char* cstr = "world";
std::cout << strlen(cstr); // 输出 5

注意 std::string::length() 不等于字节数(UTF-8 场景下尤其关键)

如果字符串含中文、emoji 等 UTF-8 编码字符,length() 返回的是字节数,不是“用户感知的字符数”。例如 "你好" 在 UTF-8 下占 6 字节,length() 返回 6,但实际只有 2 个 Unicode 码点。

没有标准库函数直接返回 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 函数,这两类错误在线上环境极难复现和调试。