strlen ,strcmp,strcat,strcpy函数以及实现

1.四种函数的简介与功能实现

2.四种函数的用C语言实现

第一节 四种函数的简介与功能实现

概述:四种函数作为库函数均存在于头文件<string.h>中,在程序编写时,我们可以通过头文件,来对这四种库函数进行直接引用。

接下来,对以上这四种库函数的功能进行逐一介绍:

strlen函数:

功能:求字符串的长度,从内存的某个位置开始扫描,直到碰到第一个字符串结束符\0为止,然后返回"\0"之前的字符数。

说明:已知一个字符串时,想要直接获取该字符串的长度时,可以通过该函数进行获取。

功能实现:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[10] = "hello";  //也可以用指针定义:const char*arr = "hello"
	int n = strlen(arr);
	printf("%d", n);
	return 0;
}

strcmp函数

功能:比较两个字符串的ACSII码值

说明:若两个字符的ACSII码值相等,则继续比较,(遇到'\0',比较结束)若不相等,则通过返回值来判断两个字符串的关系。(一般情况下,返回值有 1, -1,0三种情况)

返回值:

(1)若差值 = 0,则结束比较,说明两个字符串相等;

(2)若差值 > 0,则说明:字符串1>字符串2;

(3)若差值 < 0,  则说明: 字符串1<字符串2。

功能实现:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[10] = "hello";    //用指针:const char* arr = "hello";
	char brr[10] = "hella";    //用指针:const char* brr = "hella";
	int n = strcmp(arr, brr);
	printf("%d", n);
	return 0;
}

strcat函数

功能:将两个字符串进行链接

说明:字符串1存储于数组1中,字符串2存储于数组2中,将字符串2拼接在字符串1后面,使其变为一个新的字符串。

功能实现:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[100] = "hello";  //此处不可写为:const char* arr = "hello";    
	char brr[100] = "world";  //此处可以写为:const char* brr = "world";
	strcat(arr, brr);
	printf("%s", arr);
	return 0;
}

strcpy函数

功能:将已知的一个字符串进行复制

说明:字符串1存储于数组1中,数组2为一个空数组,通过该函数可以将数组1中的字符串复制进入数组2中。

功能实现:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[100] = "hello world";  //此处可以写为:const char* arr
	char brr[100] = {0};            //此处不可以写为:const char* brr
	strcpy(brr,arr);
	printf("%s", brr);
	return 0;
}

 第二节 四种函数的用C语言实现

概述:在平常解决问题中,我们可以直接引用头文件#include <string.h>来直接引用这四种函数,但是如果不让使用库函数来解决问题,那我们也可以根据库函数的功能用C语言的普通语句将其实现出来,同时也可以练习并提高自己的编写代码能力。

接下里,将给大家介绍以上四种函数用C语言基本语句的实现

每个函数,将分别用数组指针分别给大家进行演示:

strlen函数

指针实现

#include <stdio.h>
#include <assert.h>
int my_strlen(const char* arr)
{
    assert(arr!=NULL);
	int cnt = 0;
	while (*arr)
	{
		cnt++;
		arr++;
	}
	return cnt;
}
int main()
{
	const char* arr = "hello";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

数组实现

#include <stdio.h>
#include <assert.h>
int my_strlen(char arr[100])
{
    assert(arr!=NULL);
	int i = 0, len = 0;
	while (arr[i] != 0)
	{
		len++;
		i++;
	}
	return len;
}
int main()
{
	char arr[100] = { "hello"};
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

以上两种方法都是递归算法,在数据结构中,我们会了解到一种递归算法,这种算法既有优点,也有缺点;

优点:代码更简洁清晰,可读性更好;

缺点:时间和空间消耗比较大。

先大概了解这么多,以后为单独为大家讲解,下面是strlen函数递归算法的解法:

以字符串“hello”,为例:

我们想要知道一个字符串的长度,可以定义一个指针,通过指针的移动来进行计数,而计数结束的标准则是当指针遇到字符'\0'时,则停止,此时,指针在不断靠近'\0'的过程中,则要不断地调用my_strlen函数,则不断调用该函数的思想过程成为递归思想。

 当指针在遇到'\0'前会不断地自增,同时也会不断地调用自身函数,让指针进行进一步自增同时也会返回一个“+1”的值,等遇见'\0'时,返回0值,将0值作为最后一次调用my_strlen函数的函数值返回给上一个1 + my_strlen(arr),再将这次的结果作为返回值进行进一步的返回,以此类推,最终将最后的函数返回给main()函数。

代码如下:

#include <stdio.h>
int my_strlen(const char* arr)
{
	if (*arr)
	{
		arr++;
		return 1 + my_strlen(arr);
	}
	return 0;
}
int main()
{
	const char* arr = "hello";
	int result = my_strlen(arr);
	printf("%d", result);
	return 0;
}

说完递归与非递归,还有第三种方法等着大家哦:

指针相减法:

首先来说一下,什么是指针相减法

如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目,如果两个指针不是指向同一个数组,它们相减就没有意义了。

#include <stdio.h>
int my_strlen(const char* arr)
{
	const char* p = arr;
	while (*arr)
	{
		arr++;
	}
	return arr - p;
}
int main()
{
	const char* arr = "hello";
	int result = my_strlen(arr);
	printf("%d", result);
	return 0;

 strcmp函数

指针实现

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* arr, const char* brr)
{
	assert(arr != NULL && brr != NULL);
	while (*arr == *brr)
	{
		if (*arr == '\0')   //hell
			return 0;       //hello
		arr++;
		brr++;
	}
	int result = *arr - *brr;
	if (result > 0)
		return 1;
	else if (result < 0)
		return -1;
	else
		return 0;
}
int main()
{
	const char* arr = "hell";
	const char* brr = "hello";
	int result = my_strcmp(arr, brr);
	printf("%d", result);
	return 0;
}

数组实现

#include <stdio.h>
#include <assert.h>
int  my_strcmp(char arr[], char brr[])
{
	assert(arr != NULL && brr != NULL);
	int i = 0, j = 0;
	while (arr[i] == brr[j])
	{
		if (arr[i] == '\0')
			return 0;
		i++;
		j++;
	}
	int result = arr[i] - brr[j];
	if (result > 0)
		return 1;
	else if (result < 0)
		return -1;
	else
		return 0;
}
int main()
{
	char arr[100] = "hell";
	char brr[100] = "hello";
	int result = my_strcmp(arr, brr);
	printf("%d", result);
	return 0;
}

 strcat函数

指针实现

注:此处指针实现strcat函数,使用了三种方法,在代码中已经标明:/*(1)  */为第一种,/*(2)*/为第二种,正在使用的是第三种。

第一种与第三种的原理类似,都是通过遍历完字符串arr后在arr后将brr的字符串加进去,第二种通过计算arr长度后,通过解引用的方式,给字符串arr后直接赋予字符串brr的内容。

#include <stdio.h>
#include <assert.h>
#include <string.h>   //为了计算len_arr而使用,也可也不使用
void my_strcat(char* arr, char* brr)
{
	assert(arr != NULL && brr != NULL);
	int len_arr = strlen(arr);
	/*(1) 
     while (*arr)
	{
		arr++;
	}
	while (*brr)
	{
		*arr++ = *brr++;
	}*/
	/*(2)
    int i = 0;
	while (*(brr + i))
	{
		*(arr + len_arr + i) = *(brr + i);
		i++;
	}*/
	 while (len_arr>0)
	{
		arr++;
		len_arr--;
	}
	while (*brr)
	{
		*arr++ = *brr++;
	}
}
int main()
{
	char arr[100] = "hello";
	const char* brr = "world";
	my_strcat(arr, brr);
	printf("%s", arr);
	return 0;
}

数组实现

#include <stdio.h>
#include <assert.h>
#include <string.h>
void my_strcat(char arr[],char brr[])
{
	int i = 0, j = 0;
	assert(arr != NULL && brr != NULL);
	int len_arr = strlen(arr);
	/*(1)while (arr[i])
	{
		i++;
	}
	while (brr[j])
	{
		arr[i] = brr[j];
		i++;
		j++;
	}*/
	/*(2)while (brr[j])
	{
		arr[len_arr + i] = brr[j];
		i++;
		j++;
	}*/
	while (len_arr > 0)
	{
		i++;
		len_arr--;
	}
	while(brr[j])
	arr[i++] = brr[j++];
}
int main()
{
	char arr[100] = "hello";
	char brr[100] = "world";
	my_strcat(arr, brr);
	printf("%s", arr);
	return 0;
}

 以上数组实现也为三种方法。

 strcpy函数

指针实现

注:/*  */注释中的内容为my_strcpy的另一种方法,第一种方法是用while()循环,第二种方法是用for()循环。

#include <stdio.h>
#include <assert.h>
void my_strcpy( char* arr, char* brr)
{
    assert(arr != NULL && brr != NULL);
	while(*arr)
	{
		*brr++ = *arr++ ;
	}
	*brr= '\0' ;
}
/*for (int i = 0; *(arr + i) != '\0'; i++)
	{
		*brr++ = *(arr + i);
	}
	*brr = '\0';*/
}
int main()
{
	char arr[100] = "hello";
	char brr[100];
	my_strcpy(arr, brr);
	printf("% s", brr);
	return 0;
}

 数组实现

#include <stdio.h>
#include <assert.h>
void my_strcpy(char brr[],char arr[])
{
	assert(arr != NULL && brr != NULL);
	/*int i = 0, j = 0;
	while (arr[i])
	{
		brr[j++] = arr[i++];
	}*/
	int j = 0;
	for (int i = 0; arr[i]!= '\0'; i++)
	{
		brr[j++] = arr[i];
	}
}
int main()
{
	char arr[100] = "hello";
	char brr[100] = { 0 };
	my_strcpy(brr, arr);
	printf("%s", brr);
	return 0;
}

 数组实现用了两种方法,注释内部为第一种方法,注释外部是第二种方法。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值