一、strlen函数
1.函数介绍
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。
之前我在博客中写过关于数组运算中strlen和sizeof的区别,这里就不再多说了,附上连接:https://blog.csdn.net/cherrydreamsover/article/details/81589838
2.函数原型
3.模拟实现
- 方式一:
//计数器方式实现strlen函数
#include<stdio.h>
int my_strlen1(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
int ret = 0;
char arr[10] = "abcdef";
ret = my_strlen1(arr);
printf("arr的长度为:%d\n", ret);
return 0;
}
- 方式二:
//通过函数递归实现strlen函数
#include<stdio.h>
int my_strlen2(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen2(str+1);
}
int main()
{
int ret = 0;
char arr[10] = "abcdef";
ret = my_strlen2(arr);
printf("arr的长度为:%d\n", ret);
return 0;
}
- 方式三:
//通过指针的减操作实现strlen函数
#include<stdio.h>
int my_strlen3(const char* str)
{
char* p = str;
while (*p != '\0')
{
p++;
}
return p - str;
}
int main()
{
int ret = 0;
char arr[10] = "abcdef";
ret = my_strlen3(arr);
printf("arr的长度为:%d\n", ret);
return 0;
}
- 三种方式的运行结果一样,如下:
二、strcpy函数
1.函数介绍
strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。
2.函数原型
3.模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
char* p = src;
assert(src != NULL);
assert(dest != NULL);
while ((*dest++ == *src++))
{
;
}
return p;
}
int main()
{
int a[10];
char* p = "dbsi";
printf("%s\n", my_strcpy(a, p));
return 0;
}
运行结果:
三、strcat函数
1.函数介绍
将两个char类型连接。
char d[20]=”GoldenGlobal”; char *s=”View”; strcat(d,s);
结果放在d中
printf(”%s”,d);
输出 d 为 GoldenGlobalView (中间无空格)
d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
返回指向d的指针。
2.函数原型
3.模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest );
assert(src );
char* p = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return p;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world!";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
运行结果:
四、strstr函数
1.函数介绍
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
2.函数原型
3.模拟实现
#include<stdio.h>
#include<assert.h>
char *my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
char* p = (char*)str1;
char* substr = (char*)str2;
char* s = NULL;
if (*str2 == '\0')
return NULL;
while (*p)
{
s = p;
substr = str2;
while (*s && *substr && (*s == *substr))
{
s++;
substr++;
}
if (*substr == '\0')
return p;
p++;
}
}
int main()
{
char* a = "abcdefghj";
char* b = "efghj";
printf("%s\n", my_strstr(a, b));
return 0;
}
运行结果:
五、strcmp函数
1.函数介绍
C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1< str2,则返回负数;
若str1>str2,则返回正数。
2.函数原型
3.模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcmp(const char* src, const char* dest)
{
assert(src);
assert(dest);
int ret = 0;
while (!(ret = *(unsigned char*)(src)-*(unsigned char*)(dest)) && *dest)
{
src++;
dest++;
}
if (ret < 0)
return -1;
else if (ret>0)
return 1;
return ret;
}
int main()
{
char* a = "abcde";
char* b = "abcde";
printf("%d\n", my_strcmp(a, b));
return 0;
}
运行结果:
六、memcpy函数
1.函数介绍
memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
2.函数原型
3.模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t count)
{
assert(dest);
assert(src);
char* ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
char a[10] = "";
char b[10] = "sdfghj";
printf("%s\n", my_memcpy(a, b, 5));
return 0;
}
运行结果:
七、memmove函数
1.函数介绍
memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
2.函数原型
3.模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest);
assert(src);
char* ret = dest;
if (dest <= src || (*(char*)dest) >= (*(char*)src + count))
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
dest = (char*)dest + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
char a[20] = "abcd";
char b[10] = "cderfgh";
printf("%s\n", my_memmove(a, b, 5));
return 0;
}
运行结果:
补充:
memmove的处理措施:
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝