目录
前言
在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。
一、strlen的使用和模拟实现
1、函数的声明
size_t strlen ( const char * str );
2、注意事项
1.strlen函数返回的是在字符串中 '\0'
前面出现的字符个数(不包含 '\0'
)。
2.参数指向的字符串必须要以
'\0'
结束。
3.注意函数的返回值为size_t,是无符号的
3、模拟实现
//计数器⽅式
int my_strlen(const char * str)
{
int count = 0;
assert(str);
while(*str)
{
count++;
str++;
}
return count;
}
//不创建临时变量计数器
int my_strlen(const char * str)
{
assert(str);
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
//指针-指针的⽅式
int my_strlen(char *s)
{
assert(str);
char *p = s;
while(*p != ‘\0’ )
p++;
return p-s;
}
二、strcpy的使用和模拟实现
1、函数声明
char* strcpy(char * destination, const char * source );
2、注意事项
1.源字符串必须以
'\0'
结束。
2.会将源字符串中的 '\0'
拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可修改。
3、模拟实现
char* my_strcy(char* des, const char* sor)
{
assert(des);
assert(sor);
char* ret = des;//将首字符地址先拷贝下来
while ((*des++ = *sor++))
;
return ret;//不可返回des,因为des已经不指向首元素地址。
}
int main()
{
char arr1[30];
char arr2[] = "asdfaskdf";
printf("%s", my_strcy(arr1, arr2));
}
三、 strcat的使用和模拟实现
1、函数声明
char *strcat(char *dest, const char *src);
2、注意事项
1.源字符串必须以
'\0'
结束。
2.目标字符串中也得有
\0
,否则没办法知道追加从哪里开始。
3.目标空间必须有足够的大,能容纳下追加的内容。
4.目标空间必须可修改。
3、模拟实现
char* my_stract(char* des, const char* sor)
{
assert(des);
assert(sor);
char* ret = des;
while (*des)//一定要保证跳到\0的后面那个空间
{
des++;
}
while ((*des++ = *sor++))//不能写成前置++
{
;
}
return ret;
}
int main()
{
char arr1[30] = { "asdfasdf" };//保证被接数组有足够的空间
char arr2[] = { "fasfasd" };
printf("%s", my_stract(arr1, arr2));
return 0;
}
四、strcmp的使用和实现
1、函数声明
int strcmp(const char *str1, const char *str2)
2、判断依据
第⼀个字符串大于第⼆个字符串,则返回大于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串小于第⼆个字符串,则返回小于0的数字
比较的是字符串中对应位置上字符ASCII码值的大小。与字符串长度无关。
3、模拟实现
int my_strcmp(const char* arr1, const char* arr2)
{
while (*arr1 == *arr2)
{
if (*arr1 == '\0')//不用担心arr1先到\0的情况,如果arr1先到\0,跳出循环
return 0;//if一定比++早
arr1++;
arr2++;
}
return *arr1 - *arr2;
}
int main()
{
char arr1[] = { "asdkfka" };
char arr2[] = { "fdfsan" };
int ret = my_strcmp(arr1, arr2);
printf("%d", ret);
return 0;
}
五、strstr的使用与实现
1、函数的声明
char * strstr ( const char * str1, const char * str2);
2、返回值
函数返回字符串str2在字符串str1中第⼀次出现的位置。没有则返回null
字符串的比较匹配不包含 \0
字符,以
\0
作为结束标志。
3、模拟实现
char* my_strstr(const char* arr1, const char* arr2)
{
char* cp = (char*)arr1;
char* s1, * s2;
if (*arr2=='\0')//arr2空字符串返回arr1,实际上到arr1末尾才被匹配到
{
return (cp);
}
while (*cp)
{
s1 = cp;
s2 = (char*)arr2;
while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')// 保证s1和s2先不要到\0;如果s1剩余的不够s2则暴力破解;
{
s1++;
s2++;
if (*s2 == '\0')
{
return (cp);
}
}
cp++;
}
return (NULL);
}
int main()
{
char arr1[] = { "sasfdsff" };
char arr2[] = { "sf" };
printf("%s", my_strstr(arr1, arr2));
return 0;
}