今天偶然看到了一个实现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;

}

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

  1. UE4 C++入门之路4-PostInitProperties函数详解(设置属性默认值的四种方法)

    PostInitProperties函数详解 前言 设置属性默认值的四种方法 一 声明时赋值 二 构造函数赋值 三 构造函数初始化列表 四 PostInitProperties 前言 也许在工作或者学 ...

  2. linux c语言乘法口诀,shell 脚本实现乘法口诀表的两种方法——shell与C语言

    shell 脚本实现乘法口诀表的两种方法--shell与C语言 话不多说直接给出代码(执行c语言时没有gcc编译器会报错的哦!): 1 #!/bin/bash 2 if [ $# -eq 0 ] 3 ...

  3. 浅谈C语言将字符串中的空格替换成%20的几种方法(附图超级详细解答)

    文章目录 题目分析 暴力位移法 巧用数组法 高效倒放法 题目分析 将字符串中的空格替换为%20.样例: "abc defgx yz" 转换成 "abc%20defgx%2 ...

  4. python字母表顺序函数_python获取字母在字母表对应位置的几种方法及性能对比较...

    python获取字母在字母表对应位置的几种方法及性能对比较 某些情况下要求我们查出字母在字母表中的顺序,A = 1,B = 2 , C = 3, 以此类推,比如这道题目 https://project ...

  5. 用十种编程需语言说新年快乐_整理新年手机和PC的10种方法

    用十种编程需语言说新年快乐 Organize your phone, tablet, and computer with these quick and easy tips. 通过这些快速简便的技巧来 ...

  6. c语言猴子吃桃嵌套调用编程,C语言实现猴子吃桃问题(循环、递归两种方法)...

    [问题描述] 猴子第一天摘下若干个桃子,当即吃了一半,不过瘾,又多吃了一个:第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个:以后每天都吃前一天剩下的一半多一个,到第十天,只剩下一个桃子.求第一天猴 ...

  7. html语言音乐添加路径,HTML5简单实现添加背景音乐的几种方法

    这里推荐两种方法,就是两个标签 或者 常用 +css布局 隐藏播放器 做网站比较实用! html5添加音乐 说明: 1.src毫无疑问写路径. 2.使用hidden="true"表 ...

  8. java语言 回文判断_java判断回文字符串的几种方法

    java判断回文字符串几种简单的实现: 1.将字符串倒置后逐一比较,实现如下: public class HuiWenTest { /** * @SERLIN */ public static voi ...

  9. c语言编程 猴子吃桃子,C语言实现猴子吃桃问题(循环、递归两种方法)

    [问题描述] 猴子第一天摘下若干个桃子,当即吃了一半,不过瘾,又多吃了一个:第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个:以后每天都吃前一天剩下的一半多一个,到第十天,只剩下一个桃子.求第一天猴 ...

  10. java sendmessage函数_Unity3D中的SendMessage使用(消息传递的三种方法)

    概述 Unity提供的消息推送机制可以非常方便我们的脚本开发,它实现的是一种伪监听者模式,利用的是反射机制. 常用函数 关于消息推送,常用的函数有三个:"SendMessage". ...

最新文章

  1. mPaas 厂商 push 不通排查指南
  2. 计算机科学与技术科研论文,计算机科学与技术学院2007年度科研论文一览表
  3. Qt简单的解析Json数据例子(一)
  4. mysql NOW,CURRENT_TIMESTAMP,SYSDATE 之间的区别
  5. 单点登录之ajax跨域实现
  6. hadoop常见组件及其功能
  7. 零基础学FPGA(二):FPGA生产厂家及产品(呕心沥血,小白如何选择板卡)
  8. android省市区 简书,三级联动(省市区)
  9. MATLAB 插值函数运用 - interp1
  10. 汽车零部件生产质量安全,路在何方?
  11. SQL WITH TIES解释与用法
  12. HTML总结【详细】
  13. vim全局搜索当前目录
  14. D38 Java智能电话项目本————创建实体类
  15. pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)
  16. java毕业设计物业信息管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  17. 计算机组成原理——微程序控制器
  18. 多任务-协程(01-迭代器)
  19. 由阿里IPO引发的思考:什么样的互联网公司才是好公司?
  20. 华为云空间費用_华为云空间怎么登录,有什么用?可惜99%的人都不知道

热门文章

  1. 分布式服务架构精讲pdf文档:原理+设计+实战,(收藏再看)
  2. et结波导口转换_波导同轴转换
  3. 通过浏览器向桌面弹框示例
  4. 批处理替换网易云音乐UnblockNeteaseMusic的Ip
  5. 人工智能如何影响社会经济
  6. 5g信号频率是多少赫兹_解读5G标准:5G频率范围与频段
  7. 假技术po主之每日笑话
  8. ubuntu磁盘分配策略
  9. 微软面试题:五个囚犯抓绿豆
  10. 【libobs】deps下的w32-pthreads动态库