字符函数和内存函数 (一)

目录

一、strlen函数

1.1strlen函数的认识

1.2strlen函数的模拟实现

二、strcpy函数

2.1strcpy函数的认识

2.2strcpy函数的模拟实现

三、strcat函数

3.1strcat函数的认识

3.2strcat函数的模拟实现

 四、strcmp函数

4.1strcmp函数的认识

4.2strcmp函数的模拟实现

五、strncpy函数

5.1strncpy函数的认识

5.2strncpy函数的模拟实现

六、strncat函数

6.1strncat函数的认识

 6.2strncat函数的模拟实现

七、strncmp函数

7.1strncmp函数的认识

7.2strncmp函数的模拟实现

八、strstr函数

8.1strstr函数的认识

 8.2strstr函数的模拟实现


一、strlen函数

1.1strlen函数的认识

字符函数和内存函数 (一)_第1张图片

strlen函数的功能:strlen是计算字符串长度的函数

使用strlen函数要引头文件 

        #include

 strlen函数的使用

#include 
#include 
int main()
{
	char arr[] = "abcdef";
	int len=strlen(arr);
	printf("%d\n", len);
	return 0;
}

 注意:

  •  字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )
  • 参数指向的字符串必须要以 '\0' 结束
  • 函数的返回值为size_t,是无符号的

 这样的写法是错误的

int main()
{
    char arr1[]="abc";
    char arr2[]="bacdef";
    if(strlen(arr1)-strlen(arr1)>0)
        {
            printf("大于\n");
        }
    return 0;
}

1.2strlen函数的模拟实现

int my_strlen(const char* p)
{
	int count = 0;
	while ((*p) != '\0')
	{
		count++;
		p++;
	}
	return count;
}

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

指针-指针

int my_strlen(const char* p)
{
	char* start = p;
	while ((*p) != '\0')
	{
		p++;
	 }
	return  p - start;
}

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

函数递归

int my_strlen(const char* p)
{
	if ((*p) != '\0')
	{
		return 1 + my_strlen(p+1);
	}
	return 0;
}

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

二、strcpy函数

2.1strcpy函数的认识

字符函数和内存函数 (一)_第2张图片

 strcpy函数的功能:拷贝字符串   将源头(source)的字符串拷贝到目标字符串的空间(destination)

使用strlcpy函数要引头文件 

        #include

注意:

  • 源字符串必须以 '\0' 结束,没有 ‘\0’拷贝无法停止
  • 目标空间必须有足够的大,能容纳下源字符串的内容
  • const修饰源字符串,使源字符串不能被修改
  • 目标空间必须可修改
  • 拷贝字符串时,‘\0’也会被拷贝

字符函数和内存函数 (一)_第3张图片

 strcpy函数的使用

#include 
#include 
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxxxx";
	char arr2[] = "hello word";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

2.2strcpy函数的模拟实现

#include 
#include 
#include 
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* s = dest;
	while ((*src) != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;    //拷贝'\0'
	return s;
}

int main()
{
	char arr1[20] = "xxxxxxxxxxxxxx";
	char arr2[] = "hello word";
	printf("%s\n", my_strcpy(arr1, arr2));
	return 0;
}

说明:

返回类型写成char*是为了实现链式访问

要返回目的空间的地址,后续操作中dest的地址被改变,所以提前创建一个变量

对指针解引用操作,要保证指针的有效性,所以要加assert断言

优化代码

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* s = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return s;
}

三、strcat函数

3.1strcat函数的认识

字符函数和内存函数 (一)_第4张图片

 strcat函数的功能:追加字符串   将源头(source)的字符串连接到目标(destination)字符串的后面

使用strcat函数要引头文件 

        #include

注意:

  • 源字符串和目标字符串必须以 '\0' 结束
  • 目标空间必须有足够的大,能容纳下源字符串的内容
  • 目标空间必须可修改
  • 目的地来源不得重叠  

 strcat函数的使用

#include 
#include 
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "word";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

3.2strcat函数的模拟实现

#include 
#include 
#include 

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* s = dest;
	 //找目标字符串'\0'的位置
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return s;
}


int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "word";
	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

字符函数和内存函数 (一)_第5张图片

说明:

字符串不可以自己给自己追加,覆盖掉’\0'后再也遇不到’\0‘,程序陷入死循环。

字符函数和内存函数 (一)_第6张图片

 四、strcmp函数

4.1strcmp函数的认识

字符函数和内存函数 (一)_第7张图片

 strcmp函数的功能:比较两个字符串的大小

 比较对应字符的大小,相等时比较下一对,直到大小不相等或都遇到'\0'停止

字符函数和内存函数 (一)_第8张图片

字符函数和内存函数 (一)_第9张图片

使用strlcat函数要引头文件 

        #include

strcmp的使用:

#include 
#include 
int main()
{
	char arr1 = "abcde";
	char arr2 = "abc";
	int ret = strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

4.2strcmp函数的模拟实现

#include 
#include 
#include  
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}

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

优化代码:

返回的代码我们可以修改为

return  (*str1-*str2);

我们只要返回>0或<0的数就行,具体返回几不关心

在VS上默认返回1、0、-1

五、strncpy函数

5.1strncpy函数的认识

strncpy函数相较于strcmp函数多了一个参数size_t num 

 strncpy函数的功能:拷贝num个字符从源字符串到目标空间

字符函数和内存函数 (一)_第10张图片

使用strncpy函数要引头文件 

        #include

 strncpy函数的使用:

#include 
#include 
int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "xxxxxxxx";
    strncpy(arr1, arr2, 3);
	printf("%s\n",arr1 );
	return 0;
}

注意:

  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个 

字符函数和内存函数 (一)_第11张图片  

5.2strncpy函数的模拟实现

#include 
#include 
#include  

char* my_strncpy(char* dest, const char* src, int num)
{
	assert(dest && src);
	char* s = dest;
	int i = 0;
	for (i = 0; i < num; i++)
	{
		*dest++ = *src++;
		
	}
	return s;
}


int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "xxxxxxxx";
	printf("%s\n", my_strncpy(arr1, arr2, 3));
	return 0;
}

六、strncat函数

6.1strncat函数的认识

 strncat函数的功能:把源头(source)的num个字符连接到目标(destination)字符串的后面

字符函数和内存函数 (一)_第12张图片

使用strncat函数要引头文件 

        #include

  strncat函数的使用:

#include 
#include 
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "wordasdd";
	strncat(arr1, arr2, 4);
	printf("%s\n", arr1);
	return 0;
}

注意:

源字符串中有几个就追加几个,多余的不会补‘\0’ 

字符函数和内存函数 (一)_第13张图片

 6.2strncat函数的模拟实现

#include 
#include 
#include  

char* my_strncat(char* dest, const char* src, int num)
{
	assert(dest && src);
	char* s = dest;
	while (*dest)
	{
		dest++;
	}
	while (num--)
	{
		*dest++ = *src++;
	}
	return s;
}

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "wordasdaf";
	printf("%s\n", my_strncat(arr1, arr2, 4));
	return 0;
}

七、strncmp函数

7.1strncmp函数的认识

strncmp函数的功能:比较前num个字符的大小 

字符函数和内存函数 (一)_第14张图片

使用strncmp函数要引头文件 

        #include

strncmp函数的使用

int main()
{
	char arr1[] = "abcde";
	char arr2[] = "abc";
	int ret = strncmp(arr1, arr2, 3);
	printf("%d\n", ret);
	return 0;
}

7.2strncmp函数的模拟实现

#include 
#include 
#include  

int my_strncmp(char* dest, const char* src, int num) 
{
	int ret = 0;
	assert(dest != NULL);
	assert(src != NULL);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest) 
    {
		++dest;
		++src;
	}
	if (ret < 0) 
    {
		ret = 1;
	}
	else if (ret > 0) 
    {
		ret = -1;
	}
	return ret;
}

int main() 
{
	char arr1[20] = "abcde";
	char arr2[]= "abcdf";
	printf("%d\n", my_strncmp(arr1, arr2, 4));
	return 0;
}

八、strstr函数

8.1strstr函数的认识

字符函数和内存函数 (一)_第15张图片

 strstr函数的功能:在str1中找str2第一次出现的位置

使用strstr函数要引头文件 

        #include

strstr函数的使用:

#include 
#include 
int main()
{
	char arr1[] = "abcdsfr";
	char arr2[] = "cdse";
	char* ret = strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}

 8.2strstr函数的模拟实现

 字符函数和内存函数 (一)_第16张图片

 一开始s1和s2不相等,所以指针cp向后移,从b开始比较,继续向后找

字符函数和内存函数 (一)_第17张图片

 字符函数和内存函数 (一)_第18张图片

 当s1找到'b',s2找到'c',两个字符不像等,cp再向后移,s1回到cp的位置,s2回到str2的位置

#include 
#include 
#include  

char* my_strstr(const char* str1, const char* str2)
{
    assret(str1&&str2);
	char* cp = str1;
	char* s1 = cp;
	char* s2 = str2;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cp;

		cp++;
	}
}

int main() 
{
	char arr1[] = "abcdsfr";
	char arr2[] = "cdse";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者的支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。 

你可能感兴趣的:(算法,开发语言,c++,c语言,数据结构,排序算法)