求字符串的长度,很多人都会直接想到用strlen函数,只需要头文件string.h就可以很轻松的实现,但对于我们c语言的初学者,也应该尝试用其他方法来进行实现,除了strlen函数外有三种方法可供参考。

1.strlen

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[100]={0};
	gets(arr);
	int len = strlen(arr);
	printf("%d\n", len);
	return 0;
}

注意头文件string.h即可。

2.计数器方法

int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[100];
	gets(arr);
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

分析:首先输入字符串,定义指针变量指向首元素地址,'\0'是字符串结束标志,只要指向的数组元素不等于‘0’,就指向下一个数组元素,同时count++,两个变量一个访问元素一个计数,我们还可以进行略微的优化。

优化:

#include <stdio.h>
#include <assert.h>//断言的头文件
int my_strlen(const char* str)//const使*str不再改变
{
	int count = 0;
	assert(str != NULL);//断言保证指针的有效性
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[100];
	gets(arr);
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

分析:第一点修改在定义指针变量时我们可以在char前添加一个const,const声明变量后这个变量就不能再改变,const添加有两个位置,一是char* const str,也就是指针常量,二是const char* str,也就是常量指针,这两种效果是截然不同的,第一种是const修饰str,指针常量指向的地址不能改变,但是地址中的数值是可以改变的,可以通过其他指向该地址的指针来改变 ,第二种是修饰*str,不能通过这个指针改变变量的值。指针指向的值不能改变,但指针本身可以是可以改变指向其他地址的,这里不过多讨论。因为我们要求字符串的长度,因此肯定不希望字符串的值被改变,所以可以定义常量指针来实现。第二点修改可以添加一个断言,他的作用是若为真无事发生,若为假则报错,可以保证指针的有效性。

3.指针方法

int my_strlen(const char* str)
{
	char* temp = str;
	assert(str != NULL);//断言保证指针的有效性
	while (*str != '\0')
	{
		str++;
	}
	return str-temp;
}

int main()
{
	char arr[100];
	gets(arr);
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

分析:定义常量指针指向数组arr,此时str指向arr首元素地址,同时定义指针temp也指向arr首元素地址,此时令str逐个访问arr中的元素直到遇到‘\0’结束,两个地址相减得到的即为中间元素个数。

4.函数递归方法

#include <stdio.h>
int my_strlen(const char* str)
{
	assert(str != NULL);
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

int main()
{
	char arr[100];
	gets(arr);
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

分析:依旧是定义常量指针,在定义的函数中如果*str不等于‘\0’,就执行return 1 + my_strlen(str + 1),第一次执行后返回1,同时继续调用my_strlen函数,令str指向第二个元素,倘若第二个元素依旧不等于'\0',就返回1,指向第三个元素,继续调用函数,直到指向下一个元素为'\0'时终止。