C语言学习字符串操作函数——————>strlen strcpy strcmp 详解与手动实现

Posted 赏一杯茶:

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习字符串操作函数——————>strlen strcpy strcmp 详解与手动实现相关的知识,希望对你有一定的参考价值。

字符串操作函数


前言

C语言中对字符和字符串的处理是很频繁的,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数

一、strlen

strlen——————————
参数类型(const char* str)
返回类型(size_t)
功能求解字符串长度
  • 字符串以 ‘\\0’ 作为结束标志,strlen函数返回的是在字符串中‘\\0’前面出现的字符个数。(不包含‘\\0’)
  • 参数指向的字符串必须要以‘\\0’结束
  • 注意函数的返回值是size_t,是无符号类型的(易错
  1. strlen模拟实现

遍历字符串中的每个字符,发现不是‘\\0’就计数一次,直到发现’\\0’后返回总计数次

  • ①计数法实现strlen
int my_strlen1(const char *str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[20];
	gets(arr);
	int ret = my_strlen1(arr);//1.计数器方式
	printf("%d\\n", ret);
	return 0;
}

在这里插入图片描述
gets()函数用来获取键盘上输入的字符串,这里输了了“This is my life”

  • ②函数递归法实现
    递归的思想即自己调用自己,化复杂问题为简单问题。

在这里插入图片描述
假设现在求字符串“ABCDEFG”的长度,递归的思想即调用自己求“BCDEFG”的长度,无限调用自己,“CDEFG”、“DEFG”……,直到最后不再满足调用条件。
在这里插入图片描述

int my_strlen2(const char*str)
{
	if (*str)
	{
		return 1+my_strlen2(++str);
	}
	return 0;
}
int main()
{
	char arr[20];
	gets(arr);
	int ret = my_strlen2(arr);//2.递归
	printf("%d\\n", ret);
	return 0;
}

递归演示如下:
在这里插入图片描述

二、strcpy

strcpy——————————
参数类型(char * destination , const char * source)
返回类型(char*)
功能拷贝源字符串到目标空间
  • 源字符串必须以 ‘\\0’ 结束。
  • 会将源字符串 ‘\\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。(非常量字符串)
  • 类似于memcpy。

strcpy处理的对象是字符串类型,可以用char*类型的指针解引用操作,拷贝源字符
在这里插入图片描述
为了增加代码的安全性,引入了assert函数,用来判断目标地址与源地址是否有效

void my_strcpy(char *dest, const char* src)
{
	assert(dest&&src);
	char* ret=dest;
	while (*src && (*dest++ = *src++))
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[50];
	char arr2[20];
	gets(arr1);
	gets(arr2);
	my_strcpy(arr1, arr2);
	printf("%s\\n", my_strcpy(arr1,arr2));
	return 0;
}

my_strcpy函数内部代码简洁高效,当然不熟悉的也可写的稍微复杂些,如下:

char* my_strcpy(char *dest, const char* src)
{
	assert(dest&&src);
	char* ret = dest;
	while (*src)
	{
		*dest=*src;
		dest++;
		src++;
	}
	*dest = *src;
	return ret;
}

代码演示如下:
在这里插入图片描述

三、strcmp

strcmp——————————
参数类型(const char* str1 , const char* str2)
返回类型int
功能比较两个字符串
  • 第一个字符串大于第二个字符串,则返回大于0的数字。
  • 第一个字符串等于第二个字符串,则返回0。
  • 第一个字符串小于第二个字符串,则返回小于0的数字。
  • 字符串比较的实质是比较对应字符的ASCII码值。

在这里插入图片描述
在这里插入图片描述

如果两个字符串长度相等,字符串中每个字符的ASCII码值均相同,则返回0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码如下:

int my_strcmp(const char*str1, const char*str2)
{
	assert(str1&&str2);
	while (*str1 == *str2 )
	{
		if (*str1 == *str2&&*str1=='\\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char arr1[50];
	char arr2[50];
	int n = 0;
	gets(arr1);
	gets(arr2);
	int ret1=my_strcmp(arr1, arr2);
	if (ret1 == 0)
	{
		printf("俩字符串相同\\n");
	}
	else if (ret1 > 0)
	{
		printf("字符串arr1大\\n");
	}
	else
	{
		printf("字符串arr2大\\n");
	}
	return 0;
}

以上是关于C语言学习字符串操作函数——————>strlen strcpy strcmp 详解与手动实现的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习字符串操作函数——————>strlen strcpy strcmp 详解与手动实现

C 语言字符串操作 ( strlen 与 sizeof 函数 | 计算 字符串长度 与 内存块大小 )

c语言中strlen()怎么用

C语言写的trim()函数

如何在c语言中计算字符串长度

C语言字符串操作函数