目录
- 1. strlen函数
- 2. strcpy函数
- 3. strcat函数
- 4. strcmp函数
- 5. strstr函数
个人专栏:
《零基础学C语言》
1. strlen函数
strlen函数(Get string length)的功能是求字符串长度
使用注意事项:
- 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
- 参数指向的字符串必须要以 ‘\0’ 结束。
- 注意函数的返回值为size_t,是无符号的(易错)
在这里主要讲解三种方法模拟实现
- 方法一
- 计数器
size_t my_strlen1(const char* str)
{
assert(str);
int count = 0;
while (*str++)
{
count++;
}
return count;
}
- 方法二
- 指针-指针
- 得到的是中间元素的个数
这里我们要记录下字符串的初始位置,等str移动到 ‘\0’ 后,相减得结果
size_t my_strlen2(const char* str)
{
assert(str);
char* start = str;
while (*str)
{
str++;
}
return str - start;
}
- 方法三
- 递归
递归主要考虑返回条件和子问题
- 返回条件:如果str指向 ‘\0’ ,则返回0
- 子问题:转化为求my_strlen(str+1) (除去本身字符的字符串)+ 1(本身字符)
size_t my_strlen3(const char* str)
{
assert(str);
if (*str == '\0')
{
return 0;
}
return my_strlen3(str + 1) + 1;
}
运行结果:
void TestMyStrlen()
{
char arr[] = "abcdef";
size_t len = my_strlen3(arr);
printf("%zd\n", len);
}
2. strcpy函数
strcpy函数(Copy string)的功能是字符串拷贝
- 将源字符串拷贝到指定空间
使用注意事项:
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可修改。
- 返回值是目标空间的地址
下面代码最巧妙的地方,在于把字符串的拷贝和 ‘\0’ 的拷贝融合在一起。循环中,先赋值,再判断,最后++。这样就算遇到 ‘\0’ ,也会先拷贝,再判断停止。
char* my_strcpy(char* dst, const char* src)
{
assert(dst && src);
char* ret = dst;
while (*dst++ = *src++)
{
;
}
return ret;
}
运行结果:
3. strcat函数
strcat函数(Concatenate strings)的功能是字符串追加
- 将一段字符串追加到另一段字符串后面
使用注意事项:
- 源字符串必须以 ‘\0’ 结束。
- 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- 返回值是目标空间的地址
字符串追加可以理解为两个过程:
- 找到目标字符串末尾的 ‘\0’
- 开始追加(其实就是字符串拷贝)
char* my_strcat(char* dst, const char* src)
{
assert(dst && src);
char* ret = dst;
while (*dst)
{
dst++;
}
while (*dst++ = *src++)
{
;
}
return ret;
}
运行结果:
4. strcmp函数
strcmp函数(Compare two strings)的功能是字符串比较
- 比较两个字符串是否相等
- 如果相等,则返回0
- 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。
使用注意事项:
- 不是比较两个字符串的长度(极其易错)
- 一般我只用来判断两个字符串是否相等,至于不相等时,比较字符之间大小,我感觉还没遇到很好的应用
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
运行结果:
5. strstr函数
strstr函数(Locate substring)的功能是查找子串
- 在字符串str1中查找是否存在与str2相等的子串
- 如果存在,则返回该地址(返回字符串str2在字符串str1中第⼀次出现的位置)
- 如果不存在,则返回空指针
使用注意事项:
- 如果要查找的子串为空串,则直接返回str1的地址
我们这里采用最直观,容易理解的暴力求解法
- 额外设立cur,dst,src三个指针
- 如果子串为空,则直接返回str1
- 如果str1为空,则直接返回NULL
- 如果不满足以上情况,则进入大循环:每次循环开始,让dst指向cur所在的位置,src指向str2(子串)
- 如果*dst == *src,则继续向后比较;如果不相等,则跳出小循环,判断src是否为 ‘\0’,如果为 ‘\0’ ,则代表匹配成功,返回地址cur
- 如果不为 ‘\0’,则代表当前位置往后没有可匹配的项,则cur++,继续重复以上循环
- 若以上循环结束,还没有找到对应子串,则返回NULL
是不是光看文字还不理解,我们来看图分析:
首先,(假设dst是s1,src是s2),cur从a开始,s1和s2比较,不相等,再判断s2是否为’\0’,不为0,则cur++
cur再从b开始比较,s1和s2相等,则继续比较
直到s1和s2不相等,再判断s2是否为’\0’,不为0,则cur++
cur再从下一个b开始,同样重复以上步骤……
s2还是不为0,cur++
cur从第三个b开始,s1和s2比较。
这次,直到s1和s2不相等时,s2终于为’\0’,则代表匹配成功,返回地址cur!!!
//暴力求解
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* cur = str1;
const char* dst = NULL;
const char* src = NULL;
if (*str2 == '\0')
{
return (char*)str1;
}
while (*cur)
{
dst = cur;
src = str2;
while (*dst == *src)
{
dst++;
src++;
}
if (*src == '\0')
{
return (char*)cur;
}
cur++;
}
return NULL;
}
运行结果:
这种暴力求解的方法比较好理解,但效率却不是很高。其实还有一种高效求子串的方法——KMP算法,在后期会跟大家进行详细讲解。
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。