当前位置 : 主页 > 编程语言 > c语言 >

c语言模拟实现字符串函数

来源:互联网 收集:自由互联 发布时间:2023-09-07
目录 一.常用字符串函数介绍 1.strlen 2. strcpy 3.strcmp 4.strcat 5.strstr 二.模拟实现常用字符串函数 1.strlen 2.strcpy 3.strcmp 4.strcat 5.strstr 一.常用字符串函数介绍 1.strlen 字符串strlen是用来求字符



目录

一.常用字符串函数介绍

1.strlen

2. strcpy

3.strcmp

4.strcat

5.strstr

二.模拟实现常用字符串函数

 1.strlen

2.strcpy

3.strcmp

4.strcat

5.strstr


一.常用字符串函数介绍

1.strlen

        字符串strlen是用来求字符串长度的,我们可以打开cpp网站查看有关信息

c语言模拟实现字符串函数_字符串

        该函数用来求字符串长度,求的是‘\0’之前字符的个数,函数参数为字符指针,因为该函数不需要修改字符串的值,故为了保护字符串被意外修改,设置为只读,所以在参数字符指针用const修饰,返回值即为字符串的长度,

        下面以经典helloworld字符串为例:

c语言模拟实现字符串函数_字符串_02

 输出结果:

c语言模拟实现字符串函数_字符串_03

字符串arr1为“helloworld”,一个10个字符,该字符串长度则为10,输出结果正确

2. strcpy

        字符串函数strcpy是用来拷贝字符串的,即将一个字符串的内容拷贝到另一个字符串中,而且会将该字符的'\0'也拷贝到另一个字符串中,我们打开cpp网站查看该函数的有关信息

c语言模拟实现字符串函数_字符串_04

         该函数的参数为两个字符指针,一个指向目标字符串,一个指向源字符串,由于只需要修改目标字符串,故用const修饰源字符串以防止误修改,函数返回值是目标字符串的首地址

下面以经典helloworld字符串为例:

c语言模拟实现字符串函数_字符串_05

  输出结果:

c语言模拟实现字符串函数_编程语言_06

         可以看到我们将arr2中的helloworld成功地拷贝到了arr1中,但特别值得注意的是,当目标字符串空间不够时,强行拷贝比空间更大的字符串,虽然也可以输出结果,但毕竟是越界访问,会引发一些不可估计的问题,如将本例的arr1大小由10改为5:

c语言模拟实现字符串函数_字符串_07

c语言模拟实现字符串函数_字符串_08

可以看到程序运行后,虽然正常地打印出了结果,但是程序出错了

3.strcmp

        字符串函数strcmp函数是用来比较两个字符串大小的,但是并不是比较两个字符串的大小,而是比较字符串的内容,如果第一个字符串小于第二个字符串,则返回一个小于0的值,大于则返回一个大于0的值,等于则返回0,如“hello”和“hellz”,前面的字符都相等,‘o’小于‘z’,故"hello"小于“hellz”,如“hellx”和"hella",前面的字符都相等,'x'大于'a',所以“hellx”大于“hella”

        打开cpp网站查看该函数的相关信息

c语言模拟实现字符串函数_编程语言_09

        该函数的参数为两个字符指针,由于比较不需要修改字符串,所以两个参数都用const修饰以防误修改 返回值为int型,比较的结果为小于则为小于0的值,大于则为大于0的值,等于则为0

下面以经典的helloworld字符串为例

c语言模拟实现字符串函数_字符串_10

输出结果:

c语言模拟实现字符串函数_字符串_11

4.strcat

        字符串函数strcat是用来连接两个字符串的,即将源字符串连接到目标字符串后面,连接的步骤是先找到目标字符串的末尾‘\0’,然后再进行拷贝,所以与strcpy的区别就在于要从目标字符串的末尾开始拷贝

        打开cpp网站查看该函数的相关信息:

c语言模拟实现字符串函数_编程语言_12

         该函数的参数为两个字符指针,由于源字符串不需要修改,故加上const修饰以防误修改,返回值为连接后的字符串的地址,即目标字符串的地址

        下面以经典的helloworld字符串为例:

c语言模拟实现字符串函数_编程语言_13

 输出结果

c语言模拟实现字符串函数_编程语言_14

        可以看到我们成功地将arr2的“world”连接到arr1的“hello”中,于是arr1便变成了“helloworld”,与拷贝函数类似,特别值得注意的是,目标字符串要有足够大的空间,否则强行连接的话会出现一些未知的错误

        我们将上例的arr1的大小改为8:

c语言模拟实现字符串函数_编程语言_15

 输出结果:

c语言模拟实现字符串函数_编程语言_16

         可以看到虽然正常输出了,但是程序报错了

5.strstr

        字符串函数strstr是查找函数,在字符串中查找子串并返回子串在字符串第一次出现的地址,如果找不到子串则返回NULL

        打开cpp网站查看该函数的相关信息

c语言模拟实现字符串函数_编程语言_17

        该函数的参数为两个字符指针。由于查找并不需要修改两个字符串的内容,所以两个字符指针都用const修饰,返回值为子串在字符串中第一次出现的地址

下面以经典的helloworld字符串为例:

c语言模拟实现字符串函数_字符串_18

 输出结果:

c语言模拟实现字符串函数_编程语言_19

        可以看到“llo”可以在“helloworld”中找到,并返回指向“llo”’的地址,将改地址用%s打印,则从llo开始打印 ,即为lloworld

二.模拟实现常用字符串函数

1.strlen

       my_strlen模拟实现库函数strlen。参数为const char *,返回值为int型,即为字符串的长度,利用遍历字符串的方法,直到‘\0’结束遍历

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int my_strlen(const char* str)
{
	int len = 0;//定义长度,初始化为0
	while (*str != '\0')//从头开始遍历字符串,直到'\0'结束
	{
		len++;
		str++;
	}
	return len;//返回字符串的长度
}
int main()
{
	char arr1[] = "helloworld";
	int ret = my_strlen(arr1);
	printf("%d", ret);
	return 0;
}

2.strcpy

        利用my_strcpy模拟实现库函数strcpy,依次赋值,直到源字符串遍历到'\0"结束赋值,并返回预留的目标字符串的地址

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strcpy(char* str1, const char* str2)
{
	char* p = str1;   //定义一个p指针保存str1,以便函数结束时返回
	while (*str1 = *str2)//依次赋值,直到*str2为'\0'结束
	{
		str1++;
		str2++;
	}
	return p;//返回预留的指针P
}
int main()
{
	char arr1[20] = {0};
	char arr2[] = "helloworld";
	char *str = my_strcpy(arr1,arr2);
	printf("%s", str);
	return 0;
}

3.strcmp

        利用my_strcmp函数模拟实现库函数strcmp,依次遍历比较,如果遇到不相等的情况则直接return返回,如果两个字符串相等,则遍历到'\0'再返回0

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int my_strcmp(const char* str1, const char* str2)/*要是不相等,下面的return会结束循环,
要是相等,则遍历到'\0'才结束*/
{
	while (*str1 != '\0' || *str2 != '\0')
	{
		if (*str1 < *str2)   //小于则返回-1
			return -1;
		else if (*str1 > *str2)//大于则返回1
			return 1;
		else if (*str1 == *str2)//相等则继续比较后面的字符
		{
			str1++;
			str2++;
		}
	}
	return 0;//只有相等才会执行到这一步,即相等返回0
}
int main()
{
	char arr1[] = "helloworla";
	char arr2[] = "helloworld";
	int ret = my_strcmp(arr1,arr2);
	printf("%d", ret);
	return 0;
}

4.strcat

        利用my_strcat函数模拟实现库函数strcat,先找到目标字符串的末尾‘\0’,然后从'\0'处依次赋值,直达遍历到源字符串的末尾'\0'

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strcat(char* str1, const char* str2)
{
	char* p = str1;//保存连接字符串的地址,以便函数结束时返回
	while (*str1 != '\0')//遍历找到str1的'\0'处
	{
		str1++;
	}
	while (*str1 = *str2)//从str1的'\0'处依次赋值,直到遍历到str2的'\0'结束
	{
		str1++;
		str2++;
	}
	return p;//返回连接后字符串的地址
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	char *str = my_strcat(arr1,arr2);
	printf("%s", str);
	return 0;
}

5.strstr

        利用my_strstr函数模拟实现库函数strstr,设置两个指针分别指向两个字符串,再设置一个指针P指向当前开始比较的字符的位置,直到遍历到子串的'\0'位置则已找到子串并返回子串的位置,循环节后仍咩=没有找到子串则说明找不到子串,返回NULL

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{
	const char* s1 = str1;//定义s1指向第一个字符串
	const char* s2 = str2;//定义s2指向第二个字符串
	const char* p = str1;//定义p指向第一个字符串当前开始比较的字符
	while (*p)
	{
		s1 = p;   //从p处开始比较
		s2 = str2;//从头开始比较
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//判断遍历字符是否相等
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')//如果是因为*s2为'\0'结束,则证明找到子串,返回子串的位置
			return p;
		p++;//一轮比较后没有找到子串,则从下一个字符开始比较
	}
	return NULL;
}
int main()
{
	char arr1[] = "helloworld";
	char arr2[] = "llo";
	char *str = my_strstr(arr1,arr2);
	printf("%s", str);
	return 0;
}



上一篇:静态链表操作举例
下一篇:没有了
网友评论