在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语言有所帮助。