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


    原文地址:http://www.51testing.com/html/72/n-221172.html

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

      思路分析:

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

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

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

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

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

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

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

    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
    
    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)  /* 使用了一个int型变量 */
    {
        if(str==NULL) return 0;
        int len = 0;
        for(; *str++ != '\0'; )
        {
            len++;
        }
        return len;
    }
  • 相关阅读:
    js如何将字符串作为函数名调用函数
    js如何生成[n,m]的随机数
    UIMenuController,UIPasteboard:复制,粘贴详细解释
    python2.7和 python3.4但是不要
    Android IPC通信和AIDL技术应用
    可穿戴式智能设备,其潜在的安全问题?(上)
    CentOS安装KVM步骤虚拟机,绝对实用!
    Python于*args 和**kwargs使用
    uva 1556
    JSCover+WebDriver/Selenium获得JS 代码覆盖
  • 原文地址:https://www.cnblogs.com/cyttina/p/2737748.html
Copyright © 2020-2023  润新知