strlen函数

目录

函数介绍:

语法:

具体使用:

情况一:

情况二:

使用strlen的注意事项:

(一)

 (二)

 strlen的模拟实现:

主函数:

 一、使用递归的方式:

二、使用指针的方式:

 三、使用指针-指针的方式:


函数介绍:

计算的是字符串str的长度,从字符的首地址开始遍历,以 '\0' 为结束标志,然后将计算的长度返回,计算的长度并不包含'\0'。

语法:

size_t  strlen (const char* str); 

  1. 函数的参数为------const char* str:字符指针
  2. 返回值的类型------size_t:无符号整数(即:unsigned int)

具体使用:

情况一:

#include 
#include 
int main()
{
	char arr[10] = "abcdefgh";
	int num = strlen(arr);
	printf("数组arr的长度为:%d\n", num);
 
	return 0;
}

输出的结果:

 strlen函数_第1张图片

情况二:

#include 
#include 
 
int main()
{
	char arr[] = { 'a','b','c','d','e','f','g','h' };
	int num = strlen(arr);
	printf("数组arr的长度:%d\n", num);
 
	return 0;
}

 输出结果:

以上两种情况的结果居然不相同,这是为什么?

使用strlen的注意事项:

(一)

  1. strlen函数:当计算长度时,只有遇到'\0'才会停止计算,同时计算的长度不包含'\0'。
  2.  情况一,arr字符数组中存储的是一个字符串(字符串是以'\0'为结束标志的),所以当遍历到字符'h'后,遇见了'\0'于是停下
  3. 情况二,arr中存储的是8个字符,且字符的末尾并未有'\0'的存在,于是乎在遍历完最后一个字符后,strlen便开始在内存中寻找'\0',与似乎给出的就是一个随机值。

故:我们使用strlen函数时,应该检查字符数组是否以'\0'为结束标志。 

 (二)

int main()
{
	if (strlen("abc") - strlen("abcdef") > 0)
		printf(">\n");
	else
		printf("<=\n");
	return 0;
}

输出结果:

strlen函数_第2张图片 

疑问?

为什么abc的长度比abcdef的小,但计算出来的>?

解答:因为strlen的结果是无符号整型,进行直接相加减判断运算后的结果会通过反码补码的机制,变为一个正数,从而得到了如上图的结果。

正确的写法应该如下图所示:

int main()
{
	if (strlen("abc") > strlen("abcdef"))
		printf(">\n");
	else
		printf("<\n");
	return 0;
}

输出结果:

strlen函数_第3张图片 

 strlen的模拟实现:

主函数:

int main()
{
	char arr[50] = { 0 };
	scanf("%[^\n]s", arr);
	int ret = len(arr);
	printf("%d",ret);
	return 0;
}

 一、使用递归的方式:


int  len(char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + len(str + 1);
}

二、使用指针的方式:

int len(char* str)
{
	char* p = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - p;
}

 三、使用指针-指针的方式:

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

你可能感兴趣的:(C语言,算法,c语言,指针,数组,函数,字符串)