C++实现strlen函数:不用变量计算字符串长度的几种方法

许南星
许南星
发布时间:2026-10-13 | 4人浏览过
原创

在C++开发或面试中,经常需要手动实现标准库中的字符串处理函数。本文将详细讲解如何实现 strlen 函数,重点在于不使用任何额外的局部变量(如计数器)来统计字符串长度,并提供从常规到精简的多种代码实现。

核心思路与准备

strlen 的核心逻辑是遍历字符直到遇到结束符 '\0'。要在不使用变量计数的情况下获取长度,主要依赖两种手段:指针减法(记录起点与终点的距离)或 递归回溯(通过函数调用栈隐式计数)。

具体实现方法

第1步:使用指针减法(循环法)

这是最直观的无变量实现方式。利用两个指针分别指向字符串开头和结尾,相减得到长度。

size_t strlen(const char *str)
{
    // 注意:此实现未检查 str 是否为 NULL
    const char *eos = str;
    
    // 移动指针直到遇到结束符,此时 eos 指向 \0 的下一个位置
    while (*eos++);
    
    // 返回指针差值并减去 1,即为实际字符串长度
    return (eos - str - 1);
}

说明:

  • 入口参数为字符串首地址 str。
  • 动作是通过 while (*eos++) 原地递增指针。
  • 重要参数:指针类型 const char*,确保不修改原字符串。
  • 风险提示:如果传入 NULL,程序会直接 Core Dump。实际生产环境中需先判空。

第2步:使用递归实现(基础版)

如果不允许显式循环,可以通过递归的方式逐位判断。当遇到 '\0' 时返回 0,否则返回 1 + 递归结果。

int strlen_recursion(const char *str)
{
    if ('\0' == *str)
        return 0;
    else
        return strlen_recursion(str + 1) + 1;
}

说明:

  • 入口为字符串指针,每步递归将指针后移一位 str + 1。
  • 完成状态:当解引用结果为 0(即找到结束符)时停止递归并回传累加值。
  • 局限:对于极长字符串可能导致栈溢出(Stack Overflow),且每次递归都创建新的栈帧,效率低于循环。

第3步:使用递归与三元运算符(精简版)

将上述递归逻辑压缩为一行,利用 C/C++ 的逻辑短路特性或三元运算符简化代码结构。

int strlen_compact(const char *str)
{
    return *str ? (strlen_compact(str + 1) + 1) : 0;
}

说明:

  • *str 作为条件表达式:非零(真)则继续递归并加 1,零(假)则返回 0。
  • 这是常见的面试题写法,虽然代码简洁,但同样存在深层递归的性能隐患。

注意事项与排错

  1. 空指针保护:上述示例均假设输入合法。若在真实项目中使用,务必在函数首部添加 if (!str) return 0; 以防止段错误。
  2. 返回值类型:标准库中 strlen 返回 size_t(无符号整型)。示例中为了演示递归逻辑使用了 int,在涉及大对象时需修正为 size_t。
  3. 性能对比:指针减法法为 O(n) 时间复杂度,空间复杂度 O(1);递归法时间为 O(n),空间复杂度为 O(n)(栈深度)。建议优先掌握指针法。

总结

以上是不使用额外变量实现 C++ strlen 函数的详细内容,涵盖了从指针运算到递归优化的多种技巧。更多关于 C++ 底层原理与算法优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表