目录
在使用以下函数时,都需要引用头文件:#include<string.h>
一、strlen函数(求字符串长度函数)
1、函数介绍
size_t strlen(const char* str)
- 字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')
- 参数指向的字符串必须要以'\0'结束
- 函数的返回值为size_t(无符号int类型)
2、模拟实现strlen(计数器、递归、指针方式)
三种方式:
- 方式一(计数器方式):
int my_strlen(const char * str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
- 方式二(递归实现):
//不能创建临时变量计数器
int my_strlen(const char * str)
{
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
- 方式三(指针方式):
int my_strlen(char *s)
{
char *p = s;
while (*p != '\0')
p++;
return p - s;
}
二、strcpy函数(字符串拷贝函数)
1、函数介绍
char* my_strcpy(char* destination,const char* source);
- strcpy函数字符串source(包括终止字符'\0')复制到字符串destination中。复制或附加字符串时不执行溢出检查,如果源字符串和目标字符串重叠,strcpy行为是未定义的。
- 源字符串必须以'\0'结束
- 会将源字符串中的'\0'拷贝到目标空间
- 目标空间必须足够大,确保能存放源字符串
- 目标空间必须可变
- 函数返回值需要以字符串指针来接收
2、模拟实现strcpy
char* my_strcpy(char* dest, const char*source)
{
assert(dest != NULL&&source != NULL);//对指针进行断言
char*str2 = dest;
while (*source != '\0')
*dest++ = *source++;
*dest = '\0';
return str2;
}
三、strcat函数(字符串拼接函数)
1、函数介绍
char* strcat(char* destination,const char* source);
- strcat函数将字符串source追加到字符串destination后面,并用空字符终止字符串。字符串source的初始字符覆盖字符串destination的终止空字符。复制或追加字符串时不执行溢出检查。如果源字符串和目标字符串重叠,则strcat的行为未定义。
- 源字符串必须以'\0'结束
- 会将源字符串中的'\0'拷贝到目标空间
- 目标空间必须足够大,能够容纳下目标字符串和源字符串的内容
- 目标空间必须可变
2、模拟实现strcat
char* my_strcat(char*dest, const char* source)
{
assert(*dest != NULL&&*source != NULL);//断言
char *str = dest;
while (*dest != '\0')//找到连接处位置
dest++;
while (*source != '\0')
{
*dest++ = *source++;
}
*dest = '\0';//以空字符结束字符串
return dest;
}
四、strcmp函数(字符串比较函数)
1、函数介绍
int strcmp(const char* str1,const char* str2);
- 此函数根据ACSII编码开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或到达终止的空字符。
- 函数返回值为int类型
- 标准规则:
(1)第一个字符串大于第二个字符串,则返回大于0的数字
(2)第一个字符串等于第二个字符串,则返回0
(3)第一个字符串小于第二个字符串,则返回小于0的数字
2、模拟实现strcmp
int my_strcmp(const char* str1,const char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')//字符串比较进行到终止符,即字符串相等
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
if (*str1 < *str2)
return -1;
}
五、strstr函数
1、函数介绍
char* strstr(const char* str1,const char* str2);
- 函数搜索字符串str2在字符串str1中的第一次出现
- 该函数返回字符串的其余部分
- 如果未找到所搜索的字符串,则返回false
2、模拟实现strstr(KMP算法)
char* my_strstr(const char* dest, const char* src)
{
char* p1 = (char*)dest;//在这里需要强制类型转换成char*
char* p2 = (char*)src;
char* cp = (char*)dest;//cp就是用来保存首地址的
assert(dest != NULL&&src!=NULL);
while (*cp)
{
p1 = cp;
while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)
{
p1++;
p2++;
}
if (*p2 == '\0')
{
return cp;
}
p2 = (char*)src;
cp++;//cp++可以得到原起始位置的下一个位置
}
return NULL;
}
六、memcpy函数【字节拷贝函数(无重叠)】
1、函数介绍
void* memecpy(void* destination,const void* source,size_t num);
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
- 这个函数在遇到 '\0' 的时候并不会停下来
- 如果source和destination有任何的重叠,复制的结果都是未定义的
2、模拟实现memcpy
void* my_memcpy(void* dest, const void* str, int num)
{
assert(dest!='\0'&&str!='\0');
char* p1 = (char*)dest;//强制类型转换
char* p2 = (char*)str;
char* cp = (char*)dest;
while (num--)
{
*p1++ = *p2++;//拷贝
}
return cp;
}
七、mommove函数【字节拷贝函数(有重叠)】
1、函数介绍
void* mommove(void* destination,const void* source,size_t num);
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
2、模拟实现memmove
void* my_memmove(void* dest, const void* str, size_t count)
{
assert(dest != NULL&&str != NULL);
char* p1 = (char*)dest;
char* p2 = (char*)str;
char* cp = (char*)dest;
if (p1 > p2)//拷贝时可能出现空间重叠,因此需要逆向拷贝
{
while (count--)
*(p1 + count) = *(p2 + count);
}
else if (p1 < p2)//此时正常拷贝即可
{
while (count--)
*p1++ = *p2++;
}
return cp;
}
如果对大家有帮助的话,点赞收藏一下呀,小心心送上。