strlen函数实现的几种方法
2013-12-10 10:00
253 查看
常见的一个笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:
在字符串中通常可以利用最后一个结束符’\0’,但此处参数为const,只读,那么我们不能打他的主意。
函数运行过程中不占用内存基本不可能,除非都使用了寄存器。“不使用中间变量”只是说程序员不能显示的申请内存而已,即不能有局部变量或者动态内存申请。
如果函数自动申请栈内存或者使用寄存器存储变量,或者使用立即数寻址即常量,那么就相当于“不使用中间变量”。
从函数原型看,返回值为int,那么在函数内部必定需要一个地方存储这个值,要么是常数要么是寄存器。长度不为1时不能一次就求出来,说明必须有递归调用,这样递归时函数会自动申请栈内存,这样就相当于程序员“不使用中间变量”了。中间返回的值通过寄存器自动保存,最后一次返回时拷贝到int中去。C/C++中也有临时对象的概念,都是程序在运行过程中由编译器在栈中自动申请的对象,对程序员不可见,也相当于“不使用中间变量”
另外一个不申请任何变量的典型题目是:反转字符串。简单的源码如下:
int strlen(const char *p);
在字符串中通常可以利用最后一个结束符’\0’,但此处参数为const,只读,那么我们不能打他的主意。
函数运行过程中不占用内存基本不可能,除非都使用了寄存器。“不使用中间变量”只是说程序员不能显示的申请内存而已,即不能有局部变量或者动态内存申请。
如果函数自动申请栈内存或者使用寄存器存储变量,或者使用立即数寻址即常量,那么就相当于“不使用中间变量”。
从函数原型看,返回值为int,那么在函数内部必定需要一个地方存储这个值,要么是常数要么是寄存器。长度不为1时不能一次就求出来,说明必须有递归调用,这样递归时函数会自动申请栈内存,这样就相当于程序员“不使用中间变量”了。中间返回的值通过寄存器自动保存,最后一次返回时拷贝到int中去。C/C++中也有临时对象的概念,都是程序在运行过程中由编译器在栈中自动申请的对象,对程序员不可见,也相当于“不使用中间变量”
另外一个不申请任何变量的典型题目是:反转字符串。简单的源码如下:
#include "stdafx.h" #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 world!"; 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; }
相关文章推荐
- strlen函数的几种实现方法
- strlen函数实现的几种方法
- strlen函数的三种实现方法
- strlen的几种不同实现方法
- strlen函数的3种实现方法
- C语言strlen函数的3种实现方法
- strcat,strcpy,strcmp,strlen4个常用字符串处理函数的数组与指针简单实现方法~
- C语言中求字符串长度的函数的几种实现方法
- C++不使用变量求字符串长度strlen函数的实现方法
- C语言中strlen() strcpy() strcat() strcmp()函数的实现方法
- 字符串函数模拟实现之strlen函数的三种常见实现方法
- 不使用字符串库函数实现字符串复制的几种方法
- Python实现对一个函数应用多个装饰器的方法示例
- php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
- C语言中函数strlen等的实现
- Spring Boot实现模块化的几种方法
- Java实现几种常见排序方法
- 分析函数调用关系图(call graph)的几种方法
- strcpy strlen memcpy strcat strcmp strstr strrev函数的实现代码
- 方法中开启一个事务之后,能否调用另一个通过事务实现的函数?