今天我想要分享的是我现在所学到的一些函数,这些函数也是我们平时经常需要用到的,我会将他们用我们自己的方法实现,让我们更好的去理解他们;
strlen函数
//模拟实现strlen函数
int my_strlen1(const char* arr)//方法1 加法器
{
int count = 0;
while (*arr++)
{
count++;
}
return count;
}
int my_strlen2(const char* arr)//方法2 递归
{
if (*arr)
{
return 1 + my_strlen2(arr + 1);
}
}
int my_strlen3(const char* arr)//方法3 指针
{
char* arr1 = arr;
while (*arr1++)
{
;
}
return arr1 - arr-1;
}
int main()
{
char arr[] = "123";
printf("%d\n", my_strlen1(arr));
printf("%d\n", my_strlen2(arr));
printf("%d\n", my_strlen3(arr));
return 0;
}
这个函数可以用三种方式写出来;根据这几种方式我们可以更好地理解strlen是怎么实现的,它是从第一个字符开始判断如果这个字符存在且不是\0这个结束字符就会计入;当遇到\0字符时就会跳出;返回总共统计的数字;总而言之strlen是通过\0字符来判断字符串是否统计结束的;(我在写这个函数的时候也加深了一些对与while的理解while函数()中的条件在判断之后如果条件不满足了是还会再执行一次的,但{}中的指令不会这也是上面代码指针方式返回值为什么还要减去1的原因;)
strcpy函数
//模拟实现strcpy
char* my_strcpy(char* s1, const char* s2)//const是修饰常量类型使得*s2无法被更改
{
assert(s1 && s2);//断言这是用来增加代码健壮性的具体可以去搜一搜
char* str = s1;
while (*s1++ = *s2++);
return str;
}
int main()
{
char arr1[] = "abcdef";
char arr2[20] = {0};
printf("%s\n", my_strcpy(arr2, arr1));
return 0;
}
这个函数是将参数中后面的数组复制给前面的数组,我们需要注意前面的数组的大小一点要大于后面的数组,否则数组会放不下,我们再把后面数组的值一个一个赋值给前面的数组,直到后面的数组遇到了\0;则传递结束,我们的返回类型是char*是为了构成链式访问让我们的代码更加简洁;
strcmp函数
//模拟实现strcmp函数
int my_strcmp(const char*arr1,const char*arr2)
{
assert(arr1 && arr2);
while (*arr1 == *arr2&&*arr1&&*arr2)
{
arr1++;
arr2++;
}
if ((*arr1 - *arr2) > 0)
{
return 1;
}
else if ((*arr1 - *arr2) < 0)
{
return -1;
}
else
{
return 0;
}
}
int main()
{
char arr1[] = "abcde";
char arr2[] = "abcde";
char arr3[] = "abcdf";
char arr4[] = "abcdafasd";
printf("%d\n", my_strcmp(arr1, arr2));
printf("%d\n", my_strcmp(arr1, arr3));
printf("%d\n", my_strcmp(arr1, arr4));
return 0;
}
通过上面的代码我们可以知道这个函数是用来比较这两个函数是否相同的如果相同就会返回0,如果前面的数组大于后面的数组则返回大于0的数反之则返回小于0的数,这里的大于小于是指我们从第一个元素开始两个数组的每个两个对应元素相比较,比较这两个字符的ascii码值大小;由程序结果也可理解;
strcat函数
//模拟实现strcat函数
char* my_strcat(char*arr1, const char*arr2)
{
char* ret = arr1;
assert(arr1 && arr2);
while (*arr1 != '\0')
{
arr1++;
}
while (*arr1++ = *arr2++);
return ret;
}
int main()
{
char arr1[20] = "good ";
char arr2[] = "morning";
char*ret= my_strcat(arr1, arr2);
printf("%s", ret);
return 0;
}
这个函数是将参数后面的字符串放在前面的字符串\0处,也就是从第一个字符串\0开始放置第二个字符串;要注意第一个数组的空间可以放下第二个数组;
strstr函数
// 模拟实现strstr函数
char* my_strstr(const char*arr,const char* arr1)
{
assert(arr && arr1);
const char* str = arr;
const char* str1 = arr1;
const char* cur = arr;
while (*cur)
{
str = cur;
str1 = arr1;
while ((*str1 == *str) && *str && *str1)
{
str++;
str1++;
}
if (*str1=='\0')
{
return (char*)cur;
}
cur++;
}
return NULL;
}
int main()
{
char arr[] = "abcdefgh";
char arr1[] = "cde";
char* ret = my_strstr(arr, arr1);
if (ret == NULL)
{
printf("没有找到\n");
}
else
printf("%s\n",ret);
return 0;
}
这个函数的作用是从前面的字符串中找第二个字符串相同的字符段,返回从第一个字符串中与第2个字符串首字符相同的字符开始到\0的字符串,如果在第一个字符串中没有找到与第二个字符串相同的字符串段则返回空指针;