目录
一:strcat
思路
●找到目标空间的\0
●追加源字符串至\0
●目标空间一定要够大
代码
//strcat函数的返回值是起始空间的地址
char* my_strcat(char* dest, const char* scr) {//const防止字符串scr的内容被意外修改
assert(dest && scr);//断言
char* str = *dest;//将起始空间的地址存起来
//1.找到目标字符串的\0
while (*dest) {
dest++;
}
//2.追加源字符串至\0
while (*dest++ = *scr++) {//相当于strcpy
;
}
return str;
}
二:strcmp
图解
代码
//模拟实现strcmp
int my_strcmp(char* s1, char* s2) {
while (*s1 == *s2) {//一个字符一个比较,直到不相等
if (s1 == '\0')//如果s1为\0,那么s2也为\0,此时已经比较完成,返回
return 0;
s1++;
s2++;
}
return *s1 - *s2;//不相同,返回两个字符的差值
}
三:strcpy
思路
●这个很简单,把源空间的字符包括\0都存放在目标空间中,返回值是目标空间的起始地址
代码
//模拟实现strcpy
//返回的是目标空间的起始地址
char* my_strcpy(char* str, const char* str2) {
char* p = str;
assert(str && str2);//断言判断两个字符串是否为空
while (*str++ = *str2++) {//将str2中的字符赋给str中,包括/0
;
}
return p;
}
四:strlen
思路
●这个也很简单,只需计算出\0之前的字符个数即可,返回值是整形
代码
//模拟实现strlen
my_strlen(char* p) {
assert(p);
int count = 0;
while (*p++) {//计算\0之前的字符个数
count++;
}
return count;
}
五:strncpy
思路
●这个是长度受限制的字符串函数
●里面有3个参数,分别是目标空间,源空间和要复制的字符个数,当赋值的字符个数多于源空间的时候会在后面补零
代码
//模拟实现strncpy
//strncpy 返回的是目标空间的起始地址
char* my_strncpy(char* arr, char* arr2,int n) {
assert(arr && arr2);
char* str = arr;//存储起始地址
int count = 0;//记录复制字符串的个数
while (n--) {
count++;
if (count > strlen(arr2) && count <= n) {//当复制的个数超过了目标空间字符串的个数的时候
//并且小于要复制的字符个数的时候补\0
*arr = '\0';
}
else {
*arr++ = *arr2++;
}
}
return str;
}
六:strncat
思路
●这个和strcat比较相似,唯一区别就是多了一个追加几个字符给目标空间的参数
●当参数大于源空间的字符个数时,参数就等于源空间的字符个数
代码
//模拟实现strncat
//返回的是目标空间的起始地址
char* my_strncat(char*arr, char*arr2,int n) {
assert(arr && arr2);
char* str1 = arr;
//目标空间找到\0
while (*arr) {
arr++;
}
if (n > strlen(arr2)) {//判断字符是否超限
n = strlen(arr2);
}
//将源空间的有限个字符赋给目标空间
int count = 0;
while ( count++<n) {
*arr++ = *arr2++;
}
return str1;
}
7:strstr
思路
●本质就是在目标字符串中查找与源字符串相等的字串
●需要3个指针,两个指向目标字符串,一个指向源字符串,指向目标字符串的指针有一个是用来重新在不符合源字符串的内容的下一个字符开始查找(就是用来回退指针的)
图解
代码
char *my_strstr(const char* str1, const char* str2) {//const防止原数组被修改
assert(str1 && str2);//断言
char *p1;//创建3个指针一个指向str2,一个指向str1,另外一个也指向str1,但是是用来返回到
char *p2;
char *pc = str1;//pc是用来返回的
while (*pc) {
p1 = pc;//pc的内容给p1
p2 = str2;
while (*p1!='\0' && *p2!='\0' && *p2 == *p1) {//如果不相等,或者str2已经到了\0,或者str1不够长
//都不进入while循环
p2++;
p1++;
}
if (*p2 == '\0') {//说明str2已经到达了\0,此时str2是str1的字串,返回str2中pc指针的地址
return pc;
}else{//否则指针pc后移
pc++;
}
}
return NULL;
}
8:memcpy
思路
●和strcpy类似,但是这个可以对任意类型的数据进行拷贝,因此指针类型为void*
●由于void*是万能指针,可以接收任意类型的指针,但是不能够运算,因此考虑强制力类型转换
代码
void* my_memcpy(void* str1, const void* str2, size_t count) {
void* p = str1;
while (count--) {
*(char*)str1 = *(char*)str2;//一个字节一个字节的拷贝
//str2++;//由于str1与str2是void* 型的不能够进行运算
//str1++;
str1 = (char*)str1 + 1;//强制转换后可以进行运算,void*可以接受任意类型的指针
str2 = (char*)str2 + 1;
}
return p;
}