模拟实现库函数
1.strlen函数
1.常见法
int strlen2(char arr[])
{
int count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[] = { "abcdefg" };
int ret=strlen2(arr);
printf("%d ", ret);
return 0;
}
2.地址-地址
地址-地址得到的就是之间元素的个数
size_t my_strlen(char arr[])
{
char* start = arr;
while (*arr != '\0')
{
arr++;
}
return arr - start;
}
int main()
{
char arr[] = "abcdefg";
int len = my_strlen(arr);
printf("%d ", len);
return 0;
}
3.递归法
int my_strlen(char arr[])
{
if (*arr != '\0')
return (1 + my_strlen(arr + 1));
else return 0;
}
int main()
{
char arr[] = "abcdefg";
int len = my_strlen(arr);
printf("%d ", len);
return 0;
}
2.strcpy函数
作用:将源字符串的内容拷贝到目标空间
char* strcpy(char * destination, const char * source );
注意事项
1.源字符串要有’\0’ 拷贝时会将源字符串的’\0’一起拷贝过来
2.要保证目标空间足够大
3.目标空间可修改
void my_strcpy(char arr2[], char arr1[])
{
while (*arr1 != '\0')
{
*arr2 = *arr1;
arr1++;
arr2++;
}
*arr2 = *arr1;
}
int main()
{
char arr1[] = "hello tyut";
char arr2[20] = "xxxxxxxxxxxxxx";
my_strcpy(arr2, arr1);
printf("%s ", arr2);
return 0;
#include<assert.h>
void my_strcpy(char arr2[], char arr1[])
{
assert(*arr1);
assert(*arr2);
while (*arr2++ = *arr1++)
//while()括号里面的时赋值表达式 赋值表达式是有值的
// int a=2,b=4;
//int c=a=b; 结果为4 因为a=b的结果为4 赋值给c
//当等于\0时,循环中断,但已经赋值了 所以也会将\0赋值给arr2
{
;
}
}
int main()
{
char arr1[] = "hello tyut";
char arr2[20] = "xxxxxxxxxxxxxx";
my_strcpy(arr2, arr1);
printf("%s ", arr2);
return 0;
}
3.strcat函数
作用:将源字符串追加到目标空间
char* stract(char * destination, const char * source )
注意事项
1.目标空间必须有’\0’ 知道从哪里开始追加
2.源字符串必须有’\0’ 知道什么时候结束
3.目标空间必须足够可以装下要追加的字符串
4.目标空间大小可以修改 即不能是常量字符串
![char* my_strcat(char arr1[], char arr2[])
{
char* ret = arr1;
while (*arr1 != '\0')
{
arr1++;
}
while (*arr1++ = *arr2++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello";
char arr2[] = "tyut";
my_strcat(arr1, arr2);
printf("%s ", arr1);
}
拓展: 自己追加自己是什么情况
结果在评论区
越界访问
strcpy strcat strcmp是长度不受限制的字符串函数
strncpy strncat strncmp是长度受限制的字符串函数
作用:比较两个字符串中对应位置上两个字符的大小
//使用前需要包含头文件
#include<string.h>
int strcmp(const char *arr1,const char *arr2)
//返回值为int 是因为如果第一个字符大于第二个字符串 >0
// 如果等于 返回0
//如果小于 返回<0
#include<assert.h>
int my_strcmp(char arr1[], char arr2[])
{
assert(*arr1 != NULL);
assert(*arr2 != NULL);
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
return 0;
arr1++;
arr2++;
}
return *arr1 - *arr2;
}
int main()
{
char arr1[] = "slurh";
char arr2[] = "sludhfdq";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
printf(">\n");
else if (ret == 0)
printf("=\n");
else
printf("<\n");
return 0;
}
5.strncpy函数
char * strncpy ( char * destination, const char * source, size_t num );
void my_strncpy(char arr1[], char arr2[], size_t num)
{
while (num)
{
*arr1++ = *arr2++;
num--;
}
}
int main()
{
char arr1[20] = "xxxxxxxxxx";
char arr2[] = "abc";
int num = 3;
my_strncpy(arr1, arr2, num);
printf("%s ", arr1);
return 0;
}
如果num的数超过了arr2的字符数,将\0也加入到arr1里面后 结果如下
当num =5时
因为读取字符串时 读取到’\0’就会停止 所以打印出来没有x
6.strncat函数
char* strnact(char * destination, const char * source,size_t num )
void my_strncat(char arr1[], char arr2[], size_t num)
{
while (*arr1 != '\0')
{
arr1++;
}
while (num)
{
*arr1 = *arr2;
arr1++;
arr2++;
num--;
}
*++arr1 = '\0';
}
int main()
{
char arr1[20] = "adeg";
char arr2[] = "lishfh";
int num = 3;
my_strncat(arr1, arr2, num);
printf("%s ", arr1);
return 0;
}
7.strncmp函数
int strncmp(const char *arr1,const char *arr2,size_t num )
int my_strncmp(char arr1[], char arr2[], size_t num)
{
while (num)
{
if (*arr1 == *arr2)
{
arr1++;
arr2++;
}
num--;
}
if (*arr1 == *arr2)
return 0;
else
return *arr1 - *arr2;
}
int main()
{
char arr1[] = "slight";
char arr2[] ="sliohees";
size_t num = 4;
int ret=my_strncmp(arr1, arr2, num);
if (ret > 0)
printf(">\n");
else if (ret == 0)
printf("=\n");
else
printf("<\n");
return 0;
}