目录
一、字符串函数
1.strstr的使用和模拟实现
在这里我们先了解一下strstr函数的形式,那么strstr有什么用呢?
char * strstr(const char*str1,const char*str2);
这意思是说函数返回字符串str2在字符串str1中第一次出现的位置
这一段是说字符串的比较匹配不包含\0字符,以\0作为结束标志
下面我们可以通过例题来理解strstr函数的使用
那么strstr函数是如何模拟实现的呢?我们一样通过例题来进行理解,我们在遇到字符串的时候有两种情况,一种是出现重复时候的字符串,一种是没有重复字符串的情况,在这里我们着重来说明出现重复字符串的情况,下面我们通过画图来理解。
一开始str1,str2分别指向元素的首地址,然后我们开始进行移动,我们分别s1代表str1,s2代表str2,这么做的原因是因为我们在指向b的时候会出现错误str2指向c了,str1仍旧指着b,所以我们的str2要回到首地址,str1也是一样要回,但是不太一样,str1是要回到cp的位置,所以我们要用到s1,s2指针变量来进行移动。现在我们开始移动s1,直到移动到与s2相同元素为止,下面s1,s2都指向了相同的元素之后,s1,s2开始向右移动
这里移动之后的第2个元素也是一样的,那么我们继续向右移。
在这里我们已经发现了第三个元素不一样,这时候我们的cp就要开始向又移动一个单位
所以这时候我们的s2要回到str2所指的位置,s1则回到cp所指向的位置,开始进行下一次对比
指向的元素都相同,但是依然在指向第三个时候不同,同理,cp向右移一个单位,s2回到str2所指的位置,s1回到cp所指的位置,后面也就刚好对其且能够输出了
理解了strstr的原理之后,下面是代码实现
#include<stdio.h>
char* my_strstr(const char* str1, const char* str2)
{
char* s1, * s2, * cp;
cp = (char*)str1;
if (*str2=='\0')//如果str2第一个就是\0,那么直接就返回str1对应的值
{
return (char*)str1;
}
while (*cp)
{
s1=cp;
s2=(char*)str2;
while (*s1==*s2)
{
s1++;
s2++;
}
if (*s2=='\0')
{
return cp;
}
cp++;
}
return NULL;//如果都没有,那么就会返回一个空指针
}
int main()
{
char arr1[20] = "abbbcdef";
char arr2[] = "bbc";
char* p = my_strstr(arr1, arr2);
printf("%s ", p);
return 0;
}
2.strtok函数的使用
以下是strtok函数的形式
char * strtok ( char * str, const char * sep);
strtok的作用是什么呢?
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "zhangsan@qq.com/123";
char* sep = "@./";
char* str = NULL;
for (str = strtok(arr1, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
return 0;
}
输出结果如下
二、内存函数
1.memcpy的使用和模拟实现
memcpy的函数形式如下
void * memcpy ( void * destination, const void * source, size_t num );
memcpy的作用如下:
![](https://img-blog.csdnimg.cn/direct/a9875607aae64a5abfe32d23b4e1ade5.png)
#include<stdio.h>
void* my_memcpy(void* str1, void* str2, int sz)
{
void* ret = str1;
while(sz--)
{
*(char*)str1 = *(char*)str2;
str1=(char*)str1+1;
str2=(char*)str2+1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
int*p=my_memcpy(arr2, arr1, 4 * sizeof(int));
for (int i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
2.memmove的使用和模拟实现
memmove函数的使用与memcpy用法差不多一致,但是memmove是用来处理重复的元素的
但是在模拟实现memmove函数的时候会出现两种情况,一种是des在src前面,另一种就是des在src后面,如下:
如果src在des前面,也就是如果要复制的内容在目标内容的前面,那么我们就要从后面开始赋值,否则会出现重复的现象。如下图。
那么我们分清楚两种情况之后,就可以对memmove函数的模拟实现
void* my_memmove(void* des, void* src, int sz)
{
void* ret = des;
if (des < src)
{
while (sz--)
{
*(char*)des = *(char*)src;
des = (char*)des + 1;
src = (char*)src + 1;
}
}
else {
des = (char*)des + sz - 1;
src = (char*)src + sz - 1;
while (sz--)
{
*((char*)des) = *((char*)src);
des = (char*)des - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
int a[20] = { 1,2,3,4,5,6,7,8,9,10 };
int *p=my_memmove(a + 3, a, 5*sizeof(int));
for (int i = 0; i < 20; i++)
{
printf("%d ", a[i]);
}
return 0;
}
输出结果如下:
3.memset函数的使用
memset函数的形式如下:
void * memset ( void * ptr, int value, size_t num );
memset函数的作用是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
#include<stdio.h>
#include<string.h>
int main()
{
char a[20] = "hello world";
memset(a, 'x', 8);
printf("%s ",a);
return 0;
}
输出内容如下:
4.memcmp函数的使用
memcmp函数形式如下:
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
memcmp函数的功能与strncmp函数功能类似
memcmp函数是⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
我们下面给出一段代码来理解
#include<stdio.h>
#include<stdio.h>
int main()
{
char a1[] = "abc123";
char a2[] = "abcd123";
int n = memcmp(a1, a2, sizeof(a1));
if (n > 0)
{
printf("a1>a2");
}
else if (n < 0)
{
printf("a1<a2");
}
else {
printf("a1==a2");
}
return 0;
}
运行结果如下:
三、总结
通过这一篇内容的学习,我们要懂得并熟悉运用字符串函数strstr和strtok的功能,还有内存函数memcpy、memmove、memset、memcmp这四个的功能,其实与我们之前学过的字符函数strcpy、strcmp大同小异,而memcpy和memmove的作用可以说是几乎一样的,只不过memmove是用来处理相同元素的情况。