zoukankan      html  css  js  c++  java
  • 【转】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;
    }
  • 相关阅读:
    Codeforces Gym 100571A A. Cursed Query 离线
    codeforces Gym 100500 J. Bye Bye Russia
    codeforces Gym 100500H H. ICPC Quest 水题
    codeforces Gym 100500H A. Potion of Immortality 简单DP
    Codeforces Gym 100500F Problem F. Door Lock 二分
    codeforces Gym 100500C D.Hall of Fame 排序
    spring data jpa 创建方法名进行简单查询
    Spring集成JPA提示Not an managed type
    hibernate配置文件中的catalog属性
    SonarLint插件的安装与使用
  • 原文地址:https://www.cnblogs.com/cyttina/p/2737748.html
Copyright © 2011-2022 走看看