1、函数 strcpy
拷贝字符串
char* my_strcpy(char* p1,const char* p2) {
char* ret = p1;
assert(p1 && p2);
while (*p1++ = *p2++) {
;
}
return ret;
}
拷贝部分字符串
char* my_strncpy(char* p1, const char* p2,int len) {
int count = 0;
char* ret = p1;
assert(p1 && p2);
while (*p1++ = *p2++ ) {
count++;
if (count==len)
{
break;
}
}
return ret;
}
2、函数strcat
追加字符串
char* my_strcat(char* p1,const char* p2) {
assert(p1 && p2);
char* ret = p1;
while (*p1!='\0') {
p1++;
}
printf("这还%c\n", *p1);
while (*p1++ = *p2++)
{
printf("%c\n", *p2);
}
return ret;
}
3、函数srtcmp
比较两个字符串的大小
先比较是否相同再比较两个acssll值
在遇到\0之前如果长度等于限制就提前跳出
这个函数的\0是取决于要拷贝的函数arr2
int my_strcmp(const char*p1,const char*p2) {
assert(p1 && p2);
while (*p1==*p2)
{
if (*p1=='/0')
{
return 0;
}
p1++;
p2++;
}
if (*p1>*p2)
{
return 1;
}
else {
return -1;
}
}
4、函数strstr
计算函数包含的地址位置
代码奇妙之处在于用了指针接受了地址,cur变化的条件是找到了a和b不相等的节点
本来我打算循环找不到就跳过这一段,但没考虑到部分不符合,后来再有符合也匹配不到
例如abbaaabcd
aabcd
如果ab出现了两次并不影响
但是aaa!=aab也会跳过
连着两个a都跳过bcd就不等于abcd但实际却不是
int my_strstr(char* p1,char* p2) {
assert(p1 && p2);
char* cur = p1;
char* s1;
char* s2;
int cont = 0;
if (*p2=='\0')
{
return *p1;
}
while (*cur)
{
s1 = cur;
s2 = p2;
while((*s1==*s2)&&(*s2!='\0')&&(* s1!='\0'))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cont;
}
cur++;
cont++;
}
return NULL;
}