STM32串口中常用的字符函数strlen,strcmp,strstr详解及具体程序实现过程

STM32中 strlen(),strcmp(),strstr() 是我们在使用串口的时候,经常会用到的C语言库<string.h>里的字符串函数,用来对串口接受过来的数据进行一个判断处理。

求字符串长度函数 strlen()

函数介绍

在这里插入图片描述


传入参数:数组的首元素地址。
返回值:  返回 '\0'之前所有字符个数 数据 类型为size_t无符号整形。

函数使用

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[20] ="hello";
	int ret=strlen(arr);
    printf("%d\n", ret);
	return 0;
}

运行结果:
在这里插入图片描述

函数实现逻辑

通过上面函数的返回值,我们可以得知 ‘\0’ 是函数的结束条件,此外 ‘\0’ 是编译器主动加在每一个字符串结尾加上的。
在这里插入图片描述在这里插入图片描述
这样逻辑就简单了,只需要一个while循环一直判断是否遇到 ‘\0’ 就可以了,如果没遇到 '\0’就一直向后走,遇到了就退出循环并返回统计的值。

函数实现·

size_t my_srtlen(const char * str1)// const 将变量修饰为常量,保证传入的数据的内容不会被修改
{
	size_t count = 0;
	while (*str1++ != '\0')
	{
		count++;
	}
	return count;
}

函数实例

#include <stdio.h>
#include <string.h>
size_t my_srtlen(const char * str1)
{
	size_t count = 0;
	while (*str1++ != '\0')
	{
		count++;
	}
	return count;
}

int main()
{
	char arr[20] ="hello";
	int ret= my_srtlen(arr);
    printf("%d\n", ret);
	return 0;
}

字符串比较函数 strcmp()

函数介绍

在这里插入图片描述


传入参数:两个要比较字符串数组的首元素地址。
返回值:  
           str1>str2 返回大于0的数
           str1=str2 返回0
           str1<str2 返回小于0的数
  字符之间比较的是ASCII码之间的大小。

函数使用

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] ="afc";
	char arr1[] = "abc";
	int ret= strcmp(arr,arr1);
    printf("%d\n", ret);
	return 0;
}

函数实现逻辑

通过上面传入参数和返回值,可以知道需要while循环来不断的遍历这两个数组的所有元素,直到遇见 ‘\0’ 相等就退出循环并返回0,并且在循环里会不断判断出两个字符之间的大于或小于,那就返回相应的正负值。
在这里插入图片描述但是在写的过程中,我们会发现我们可以把两个数组里元素是否相等做为循环判断条件,如果所有的元素都相等那么就一直向后走,直到遇到 ‘\0’ 就退出函数并返回0 ,如果不相等就会退出循环返回两个元素相减的值,这样就显得代码更加简洁高效。

函数实现·

int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

函数实例

#include <stdio.h>
#include <string.h>
int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char arr[] ="afc";
	char arr1[] = "abc";
	int ret= my_strcmp(arr,arr1);
    printf("%d\n", ret);
	return 0;
}

查找子字符串函数 strstr()

函数介绍

在这里插入图片描述


传入参数:
    str1:指向一个字符串,从此字符串中查找 str2子串。
    str2 : 要查找的子串。
返回值:  
    如果找到子串,则该函数返回一个指向子串第一次出现的位置;反之,如果未在str1字符串中找到子串,则返回 NULL。

函数使用

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] ="aaabccc";
	char arr1[] = "bc";
    printf("%s\n", strstr(arr, arr1));
	return 0;
}

函数实现逻辑

创建三个字符常量指针,第一个 temp是用来存储子字符串首次出现在主字符串的地址,第一个while循环是为了不断的通过temp++;遍历主字符串,如果直到遇到’\0’还没有匹配到子字符串的话,就说明没有找到返回NULL,sr1 = temp; 是保证在匹配不完全成功的情况下还能回到最开始匹配上的后一位,从后一位再开始重新匹配,sr2 = str2;也同样是为了保证在不完全匹配成功的时候,能退回来找到子字符串首元素的位置,重新开始匹配,第二个while循环是不断的判断主字符串和子字符串是否匹配如果匹配就向后移动一位,并且两个的值不能为’\0’,当sr2的值为’\0’是说明匹配成功返回首次匹配的地址temp。

函数实现

const char* my_strstr(const char *str1,const char *str2)
{
	assert(str1&&str2);
	const char* temp=str1;
	const char* sr1 = str1;
	const char* sr2 = str2;
	if (*str2 == '\0')
		return str1;
	while(*temp)
	{ 
		sr1 = temp;
		sr2 = str2;
		while (*sr1==*sr2&&*sr1 !='\0' && *sr2 != '\0')
		{
			sr1++;
			sr2++;
		}
		if (*sr2 == '\0')
			return  temp;
		temp++;
	}
	return NULL;
}

函数实例

#include <stdio.h>
#include <string.h>
const char* my_strstr(const char *str1,const char *str2)
{
	assert(str1&&str2);
	const char* temp=str1;
	const char* sr1 = str1;
	const char* sr2 = str2;
	if (*str2 == '\0')
		return str1;
	while(*temp)
	{ 
		sr1 = temp;
		sr2 = str2;
		while (*sr1==*sr2&&*sr1 !='\0' && *sr2 != '\0')
		{
			sr1++;
			sr2++;
		}
		if (*sr2 == '\0')
			return  temp;
		temp++;
	}
	return NULL;
}
int main()
{
	char arr[] ="aaabccc";
	char arr1[] = "bc";
    printf("%s\n", my_strstr(arr, arr1));
	return 0;
}