天天看点

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

字符串操作函数

      • 一、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;
}
           
【C语言学习】字符串操作函数(1)——————>strlen strcpy strcmp 详解与手动实现

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

  • ②函数递归法实现

    递归的思想即自己调用自己,化复杂问题为简单问题。

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

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

【C语言学习】字符串操作函数(1)——————>strlen strcpy strcmp 详解与手动实现
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;
}
           

递归演示如下:

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

二、strcpy

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

strcpy处理的对象是字符串类型,可以用char*类型的指针解引用操作,拷贝源字符

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

为了增加代码的安全性,引入了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;
}
           

代码演示如下:

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

三、strcmp

strcmp ——————————
参数类型 (const char* str1 , const char* str2)
返回类型 int
功能 比较两个字符串
  • 第一个字符串大于第二个字符串,则返回大于0的数字。
  • 第一个字符串等于第二个字符串,则返回0。
  • 第一个字符串小于第二个字符串,则返回小于0的数字。
  • 字符串比较的实质是比较对应字符的ASCII码值。
【C语言学习】字符串操作函数(1)——————>strlen strcpy strcmp 详解与手动实现
【C语言学习】字符串操作函数(1)——————>strlen strcpy strcmp 详解与手动实现
如果两个字符串长度相等,字符串中每个字符的ASCII码值均相同,则返回0
【C语言学习】字符串操作函数(1)——————>strlen strcpy strcmp 详解与手动实现
【C语言学习】字符串操作函数(1)——————>strlen strcpy strcmp 详解与手动实现
【C语言学习】字符串操作函数(1)——————>strlen strcpy strcmp 详解与手动实现

代码如下:

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;
}
           

继续阅读