C语言函数替代strlen,C语言实现strlen函数的几种方法【转】

本文记录了一种不使用中间变量实现strlen函数的方法,主要通过递归方式完成。作者详细分析了函数实现的思路,指出在不改变const字符串的情况下,如何利用递归和栈内存来计算字符串长度。同时,提供了三种不同的实现方式,并在main函数中进行了测试。这种技巧在面试和编程实践中都有一定的价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天偶然看到了一个实现strlen函数的方法,也实际练习了一下,挺有意义的,其实现的一些思想值得学习,记录一下吧。我这里除了写两个比较巧妙的递归实现之外,也写了另外一种常规的方式。

传说常见的一个笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:int

strlen(const char *p);

思路分析:

在字符串中通常可以利用最后一个结束符’\0’,但此处参数为const,只读,那么我们不能打他的主意。

函数运行过程中不占用内存基本不可能,除非都使用了寄存器。“不使用中间变量”只是说程序员不能显示的申请内存而已,即不能有局部变量或者动态内存申请。

如果函数自动申请栈内存或者使用寄存器存储变量,或者使用立即数寻址即常量,那么就相当于“不使用中间变量”。

从函数原型看,返回值为int,那么在函数内部必定需要一个地方存储这个值,要么是常数要么是寄存器。长度不为1时不能一次就求出来,说明必须有递归调用,这样递归时函数会自动申请栈内存,这样就相当于程序员“不使用中间变量”了。中间返回的值通过寄存器自动保存,最后一次返回时拷贝到int中去。C/C++中也有临时对象的概念,都是程序在运行过程中由编译器在栈中自动申请的对象,对程序员不可见,也相当于“不使用中间变量”

另外一个不申请任何变量的典型题目是:反转字符串

这种问题都是利用常量,或者将变量的申请交给编译器在递归过程中自动在栈中申请,也就是借刀杀人了。

无代码,无真相;简单的源码如下:

#include

#include

#include

int myStrlen(const char *str);

int myStrlen1(const char *str);

int myStrlen2(const char *str);

int main()

{

char

*str=NULL;

str = "Hello

Jay!";

printf("original strlen():%d\n",strlen(str));

printf("myStrlen():%d\n",myStrlen(str));

printf("myStrlen1():%d\n",myStrlen1(str));

printf("myStrlen2():%d\n",myStrlen2(str));

}

int myStrlen(const char

*str)

{

if ( (str ==

NULL) || (*str == '\0') ) {

return 0;

}

else

{

return myStrlen(str+1)+1;

}

}

int myStrlen1(const char *str)

{

assert(str

!= NULL);

return *str

? (myStrlen1(++str) + 1) : 0;

}

int myStrlen2(const char *str)

{

if(str==NULL) return 0;

int len =

0;

for(; *str++

!= '\0'; )

{

len++;

}

return

len;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值