Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101063
  • 博文数量: 34
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 217
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-10 23:36
文章分类
文章存档

2013年(34)

我的朋友

分类: C/C++

2013-04-01 08:31:18

不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:int strlen(const char *p);

思路分析:

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

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

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

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

C++中也有临时对象的概念,都是程序在运行过程中由编译器在栈中自动申请的对象,对程序员不可见,也相当于“不使用中间变量”

另外一个不申请任何变量的典型题目是:反转字符串(http://blog.csdn.net/sailor_8318/archive/2008/10/11/3058240.aspx

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

//////////////////////////////////////////////////////////////////////////

int NoMallocStrlen(const char *str)

{

    if (str==NULL)

   {

   return 0;

    }

   if (*str != '/0')

   {

   return 1+NoMallocStrlen(++str);

   }

   else

      return 0;

}

int main()

{

    const char *p = "hello!";

    int a = NoMallocStrlen(p);

   if(a == strlen(p))

   {

      printf("NoMallocStrlen is well done!/n");

    }

   else

   {

   printf("Error!/n");

    }

}

阅读(1065) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~