C语言字符串函数模拟实现流程介绍

2022-11-13 17:11:19 函数 字符串 流程

该文章将简易模拟实现strlen、strcpy、strcat、strcmp、strstr。那么让我们废话少说,直接开始吧。

一、strlen

strlen-Get string length.即获取字符串长度。函数参数为 const char* str,函数返回类型为 size_t。如下图所示:

strlen函数的读取结束标志为’\0’,因此,若字符串中没有’\0’,字符串长度则为随机值。

下面将以三种方式模拟实现strlen函数,函数将命名为 my_strlen。

1.使用计数器

#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
	assert(str);//断言一下传过来的参数是否为空指针
	size_t count = 0;//设置一个计数器
	while (*str++)
	{
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "hello world!";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

显示结果:

该方法为设置一个计数器变量 count,让计数器在指针每增加一个字节时自增一,当 *str 为’\0’时,循环结束,返回的count就是字符串长度。

2.使用函数递归

#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
	assert(str);
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "hello world!";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

显示结果:

3.使用指针-指针

#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
	assert(str);
	const char* start = str;
	const char* end = str;
	while (*end != '\0')
	{
		end++;
	}
	return end - start;
}
int main()
{
	char arr[] = "hello world!";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

显示结果:

二、strcpy

strcpy-Copy string.即拷贝字符串。函数参数为 char* dest 和 const char* scr,函数返回类型为 char*。如下图所示:

源字符串必须以’\0’结束,目标字符串会将’\0’一同拷贝

下面将模拟实现strcpy,函数命名为my_strcpy

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* scr)
{
	assert(dest);
	assert(scr);
	char* start = dest;//记录目标指针的起始位置
	while (*dest++ = *scr++)
	{
		;
	}
	return start;
}
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxxxxxx";
	char arr2[] = "hello world!";
	printf("%s\n", my_strcpy(arr1, arr2));
	return 0;
}

显示结果:

三、strcat

strcat-Concatenate strings.即连接字符串。函数参数为 char* dest 和 const char* scr,函数返回类型为 char*。如下图所示:

源字符串必须以’\0’结束,否则程序将崩溃。

下面将模拟实现strcat,函数命名为my_strcat

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* scr)
{
	assert(dest);
	assert(scr);
	char* start = dest;
	while (*dest != '\0')
	{
		dest++;//先将目标指针遍历到'\0'的位置上
	}
	while (*dest++ = *scr++)
	{
		;
	}
	return start;
}
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world!";
	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

显示结果:

四、strcmp

strcmp-Concatenate strings.即比较两个字符串。函数参数为 const char* str1 和 const char* str2,函数返回类型为 int。如下图所示:

标准规定:

1. str1>str2,返回值>0

2. str1==str2,返回值=0

3. str1<str2,返回值<0

下面将模拟实现strcmp,函数命名为my_strcmp

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	while (*str1 == *str2)
	{
		if (*str1 != '\0')//两个字符串对应元素相等并都不为'\0'时,遍历这个字符串
		{
			str1++;
			str2++;
		}
		else
			return 0;//此为直到两个字符串结束都相等,所以返回0
	}
	return *str1 - *str2;//不相等时返回两个字符串对应元素的差值即可判断大小。
}
int main()
{
	char arr1[] = "abc";
	char arr2[] = "abcd";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0)
	{
		printf("arr1>arr2\n");
	}
	else if (ret < 0)
	{
		printf("arr1<arr2\n");
	}
	else
		printf("arr1==arr2\n");
	return 0;
}

显示结果:

到此这篇关于C语言字符串函数模拟实现流程介绍的文章就介绍到这了,更多相关C语言字符串函数内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章