C语言函数替代strlen,C语言实现strlen函数的几种方法【转】
今天偶然看到了一个实现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函数的几种方法【转】相关推荐
- UE4 C++入门之路4-PostInitProperties函数详解(设置属性默认值的四种方法)
PostInitProperties函数详解 前言 设置属性默认值的四种方法 一 声明时赋值 二 构造函数赋值 三 构造函数初始化列表 四 PostInitProperties 前言 也许在工作或者学 ...
- linux c语言乘法口诀,shell 脚本实现乘法口诀表的两种方法——shell与C语言
shell 脚本实现乘法口诀表的两种方法--shell与C语言 话不多说直接给出代码(执行c语言时没有gcc编译器会报错的哦!): 1 #!/bin/bash 2 if [ $# -eq 0 ] 3 ...
- 浅谈C语言将字符串中的空格替换成%20的几种方法(附图超级详细解答)
文章目录 题目分析 暴力位移法 巧用数组法 高效倒放法 题目分析 将字符串中的空格替换为%20.样例: "abc defgx yz" 转换成 "abc%20defgx%2 ...
- python字母表顺序函数_python获取字母在字母表对应位置的几种方法及性能对比较...
python获取字母在字母表对应位置的几种方法及性能对比较 某些情况下要求我们查出字母在字母表中的顺序,A = 1,B = 2 , C = 3, 以此类推,比如这道题目 https://project ...
- 用十种编程需语言说新年快乐_整理新年手机和PC的10种方法
用十种编程需语言说新年快乐 Organize your phone, tablet, and computer with these quick and easy tips. 通过这些快速简便的技巧来 ...
- c语言猴子吃桃嵌套调用编程,C语言实现猴子吃桃问题(循环、递归两种方法)...
[问题描述] 猴子第一天摘下若干个桃子,当即吃了一半,不过瘾,又多吃了一个:第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个:以后每天都吃前一天剩下的一半多一个,到第十天,只剩下一个桃子.求第一天猴 ...
- html语言音乐添加路径,HTML5简单实现添加背景音乐的几种方法
这里推荐两种方法,就是两个标签 或者 常用 +css布局 隐藏播放器 做网站比较实用! html5添加音乐 说明: 1.src毫无疑问写路径. 2.使用hidden="true"表 ...
- java语言 回文判断_java判断回文字符串的几种方法
java判断回文字符串几种简单的实现: 1.将字符串倒置后逐一比较,实现如下: public class HuiWenTest { /** * @SERLIN */ public static voi ...
- c语言编程 猴子吃桃子,C语言实现猴子吃桃问题(循环、递归两种方法)
[问题描述] 猴子第一天摘下若干个桃子,当即吃了一半,不过瘾,又多吃了一个:第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个:以后每天都吃前一天剩下的一半多一个,到第十天,只剩下一个桃子.求第一天猴 ...
- java sendmessage函数_Unity3D中的SendMessage使用(消息传递的三种方法)
概述 Unity提供的消息推送机制可以非常方便我们的脚本开发,它实现的是一种伪监听者模式,利用的是反射机制. 常用函数 关于消息推送,常用的函数有三个:"SendMessage". ...
最新文章
- mPaas 厂商 push 不通排查指南
- 计算机科学与技术科研论文,计算机科学与技术学院2007年度科研论文一览表
- Qt简单的解析Json数据例子(一)
- mysql NOW,CURRENT_TIMESTAMP,SYSDATE 之间的区别
- 单点登录之ajax跨域实现
- hadoop常见组件及其功能
- 零基础学FPGA(二):FPGA生产厂家及产品(呕心沥血,小白如何选择板卡)
- android省市区 简书,三级联动(省市区)
- MATLAB 插值函数运用 - interp1
- 汽车零部件生产质量安全,路在何方?
- SQL WITH TIES解释与用法
- HTML总结【详细】
- vim全局搜索当前目录
- D38 Java智能电话项目本————创建实体类
- pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)
- java毕业设计物业信息管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
- 计算机组成原理——微程序控制器
- 多任务-协程(01-迭代器)
- 由阿里IPO引发的思考:什么样的互联网公司才是好公司?
- 华为云空间費用_华为云空间怎么登录,有什么用?可惜99%的人都不知道