C/C++面试之算法系列--借刀杀人,不使用任何中间变量实现strlen

本文介绍了如何在C/C++面试中,不使用任何中间变量实现求字符串长度的strlen函数。该方法利用递归和编译器在栈中自动申请空间,遵循只读参数的要求。示例代码展示了一个递归实现的strlen函数,通过检查字符串结束符并递归调用来计算长度。
摘要由CSDN通过智能技术生成
 

 

借刀杀人,不使用任何中间变量实现strlen

 

Sailor_forever  sailing_9806@163.com 转载请注明

http://blog.csdn.net/sailor_8318/archive/2008/10/13/3071048.aspx

 

 

 

2009腾迅校园招聘笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:int strlen(const char *p)

 

思路分析:

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

 

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

 

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

 

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

 

C++中也有临时对象的概念,都是程序在运行过程中由编译器在栈中自动申请的对象,对程序员不可见,也相当于“不使用中间变量”

 

另外一个不申请任何变量的典型题目是:反转字符串(http://blog.csdn.net/sailor_8318/archive/ 2008/10/11 /3058240.aspx

 

这种问题都是利用常量,或者将变量的申请交给编译器在递归过程中自动在栈中申请,也就是借刀杀人了,不管我的事,我只是出来打酱油的,哈哈

 

//

int NoMallocStrlen(const char *str)

{

        if (str==NULL)

        {

                return 0;

        }

 

        if (*str != '/0')

        {

                return 1+NoMallocStrlen(++str);

        }

        else

                return 0;

}

 

int main()

{ 

        const char *p  = "hello!";

        int a = NoMallocStrlen(p);

 

        if(a == strlen(p))

        {

                printf("NoMallocStrlen is well done!/n");

        }

        else

        {

                printf("Error!/n");

        }

}

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值