zoukankan      html  css  js  c++  java
  • 不使用任何中间变量实现strlen

    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");

    }

    }

  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/xmphoenix/p/2257702.html
Copyright © 2011-2022 走看看