目录
一、strlen
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
模拟实现:
#include<stdio.h>
#include<assert.h>
int Mystrlen(const char* str)//const可以防止字符串内容被改变
{
assert(str);//防止传入空指针
int count = 0;
while (*str++)
{
count++;
}
return count;
}
二、strcat
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
返回值:该函数返回一个指向最终的目标字符串 dest 的指针。
模拟实现:
const char *Mystrcat(char *str1, const char *str2)
{
assert(str1 && str2);
char* p1 = str1;//复制一份目标字符串头指针
while (*str1)//先找str1中的 \0
{
str1++;
}
while (*str1++ = *str2++)//拷贝字符串
;
return p1;//返回最终的目标字符串
}
三、strcmp
C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
返回值:
str1 > str2 返回值大于0
str1 < str2 返回值小于0
str1 == str2 返回值等于0
注意:字符串的比较方式为:两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。如:
1."A"<"B"
2."A"<"AB"
3."abcdz" > "abcdefghi"
模拟实现:
int Mystrcmp(const char *str1, const char *str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (!(*str1)) //两者匹配到结尾还是相同,结尾\0的ASCII码为0
return 0;
str1++;
str2++;
}
if (*str1 > *str2) //就算一个指针先到了结尾,结尾\0的ASCII码也是最小的
return 1;
else
return -1;
}
四、strstr
C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
模拟实现
const char *Mystrstr(const char *str1, const char *str2)
{
assert(str1 && str2); // str1 与 str2不能是空指针
const char *p1, *p2, *t;
if (*str2 == '\0')//排除str2长度为0的情况
return str1;
p1 = str1;
while (*p1 != '\0')
{
p2 = str2;
while (*p1 && (*p1 != *str2))//p1与str2首元素匹配
{
p1++;
}
t = p1;//记录匹配成功的位置
while (*p1 && *p2 && *p2 == *p1)//其中一个到了末尾就停下
{
p1++;
p2++;
}
if (!(*p2))//如果p2到了末尾
return t;
p1=t+1;//p1回到第一次匹配成功的下一位
}
return NULL;//没有找到
}
五、memcpy
C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
模拟实现:
void* Mymemcpy(void* str1, const void* str2, int n)
{
assert(str1 && str2);
char* p1 = (char*)str1,*p2 = (char*)str2;//char大小为1可以用来逐个字节操作
int i;
for (i = 0; i < n; i++)
{
p1[i] = p2[i];
}
return str1;
}
六、memmove
C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。
如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
如果重叠
如果反过来就要换方向
模拟实现
void *Mymemove(void *str1, const void *str2, int n)
{
assert(str1 && str2);
char *p1 = (char *)str1, *p2 = (char *)str2;
int i;
if (str1 < str2)//这里是考虑指向的内容重叠所以拷贝的方向有区别
for (i = 0; i < n; i++)
{
p1[i] = p2[i];
}
else
for (i = n - 1; i >= 0; i--)
{
p1[i] = p2[i];
}
return str1;
}