C语言strlen()函数及其模拟实现

在C语言中有一类常量叫做字符串常量,虽然字符串也是放在一个数组中,但是却不能和其他数组一样计数。为了解决这个问题,C语言专门用一个函数来计算字符串长度,这便是strlen()函数。

 先来看一看什么样的形式是字符串。一般的,字符串有以下两种定义方式

char ch[]="abcdef"//由用户输入字符串内容,编译器根据内容自主分配空间

char ch[]={'a','b','c','d','e','f','/0'}//这也是一个字符串,注意末尾的'/0'必不可少,否则这只是一个字符数组!

 这个空字符('/0')使得字符串计算长度与众不同,接下来我们正式介绍strlen()函数。

strlen()函数原型如下:

size_t strlen ( const char * str );

//size_t是一个整型,str是一个字符指针,也就是说该函数接受一个字符元素的地址,并且它的返回值是一个整型(并且是无符号整型)

 

//strlen的使用
#include<string.h>//内含strlen()的原型和定义 c++中是cstring
#include<stdio.h>
int main()
{
  int i=0;
   char ch[]="abcdef";
    i=strlen(ch);
printf("%d",i);
   return 0;
}

运行结果如下:

 接下来,我们说一说它的工作原理。strlen()函数内置一个计数器,当字符不是空字符时,计数器递增,接着当走到空字符时就停止把值返回。

因此实现方法一如下:

#include<string.h>
#include<stdio.h>
int lenth(char* ps)//模拟实现strlen()
{
	int len = 0;
	while (*ps)//判断字符是否是空字符,空字符循环停止
	{   
		len++;//
		ps++;
	}
	return len;
}
int main()
{  int i = 0;
char ch[] = "abcdef";
   i = lenth(ch);
  printf("%d", i);
	return 0;
}

 输出结果如下:

 思路二: 递归

我们知道,C函数支持调用自己,我们不妨可以把strlen()的计数分成这样

//"abcdef/0"
//1+"bcdef/0"
//1+1+"cdef/0"

也就是把字符串一级一级的变少,知道只剩空字符。因此可以这样写:

 

int my_strlen(char* ps)
{
	if (*ps == 0)
		return 0;
	else
		return 1 + my_strlen(ps + 1);
}

int main()
{  int i = 0;
char ch[] = "abcdef";
i = my_strlen(ch);
  printf("now the stringlenth is %d", i);
	return 0;
}

输出结果如下:

 

然而,这样做还是有一定缺陷:因为可能设计者会忘记对ps递增而导致栈溢出,所以我们对代码进行如下优化:

​​​​int my_strlen(char* ps)
{
	if (*ps++==0)//判断条件使用后缀自增,确保*ps++是当前字符,并让指针指向下一字符
		return 0;
	else
		return 1 + my_strlen(ps);
}

int main()
{  int i = 0;
char ch[] = "abcdef";
i = my_strlen(ch);
  printf("now the stringlenth is %d", i);
	return 0;
}

 输出结果如下:

 

 综上以上是strlen()函数的使用和模拟实现,希望对大家学习C语言有所帮助。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值