🚀🚀前言
大家好,本文主要深度讲解常用字符串函数的细节,并且模拟实现一遍,收录到C—语法
专栏,定期更新C语言语法方面知识,都是比较详细的,自己复习的同时也希望能帮助到大家,如果有不对或者不足的地方欢迎评论区补充。
🏡个人主页:悲伤的猪大肠9的博客-C语言领域博主
✨如果文章对你有帮助记得点赞收藏关注哦!!✨
🌈重要的不是成功,而是奋斗的过程
本章重点:
重点介绍常用处理字符串的库函数的使用以及注意事项,并且模拟实现,便于更深刻的理解下列函数。
strlen() 求字符串长度
strcpy() 复制字符串
strcmp() 比较两个字符串大小
strcat() 字符串拼接
strstr() 在其他字符串中查找是否有子串
一、strlen()
size_t strlen ( const char* str )
用于计算字符串长度
注意事项
- 字符串遇到 ‘ \0 ’ 结束,函数返回的长度不包括 ’ \0 ‘
- 注意传进来的字符串必须要以 ’ \0 ‘ 结尾否则直到在内存中遇到 ‘ \0 ’ 才会停止 ,相当于随机值
- 函数返回值是size_t
模拟实现🍉
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* pc)
{
assert(pc);
int count = 0;
while (*pc++) //遇到'\0'结束
{
count++;
}
return count;
}
int main()
{
char c[] = "adfafds";
printf("%d", my_strlen(c)); //7
return 0;
}
二、strcpy()
char* strcpy(char* destination , const char* source)
用于拷贝一个字符数组或字符串到另一个字符数组里面
注意事项
- 源字符串必须要以 ’ \0 ‘ 结尾
- 目标空间必须足够大,否则会报错
- 目标空间不能为常量字符串,常量不能修改
- 拷贝的时候会把源字符串的 ‘ \0 ’ 也拷贝过去
🍎模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* s1,const char* s2)
{
assert(s1&&s2);
char* ret = s1; //记录指针首地址
while (*s1++ = *s2++); //将字符串拷贝
return ret;
}
int main()
{
char s1[20] = "ahunb";
char s2[] = "tiantianxiangshang";
printf("%s", my_strcpy(s1, s2)); //tiantianxiangshang
}
三、strcmp()
int strcmp (const char* str1,const char* str2)
用于比较两个字符串大小(注意不是比较长短,而是逐个比较,一旦遇到不相等的就返回)
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
🥝模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2) //判断每个字符是否相等
{
if (*s1 == '\0' && *s2 == '\0') //两个都到'\0'证明已经到字符串末尾了还没有不相等,则相等返回0
{
return 0;
}
s1++;
s2++;
}
return *s1 - *s2;//如果不想打则跳出上面循环,返回*s1-*s2 ,S1如果比S2大返回的就是大于0的数,反之返回小于0的数
}
int main()
{
char* s1 = "abbbcdefg";
char* s2 = "abbcdefg";
if (my_strcmp(s1, s2) > 0)
{
printf(">");
}
else if (my_strcmp(s1, s2) < 0)
{
printf("<");
}
else
{
printf("=");
}
}
四、strcat()
char* strcat (char* destination,const char* source)
用于在一个字符串后面接上另一个字符串
注意事项
- 源字符串必须以 ‘ \0 ’ 结束
- 目标空间不能为常量字符串,因为常量字符串不能修改
- 目标空间必须足够大,否则会报错
🍐模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* s1,char*s2)
{
assert(s1 && s2);
char* ret = s1;
while (*s1)
{
s1++; //先遍历到数组末尾
}
while (*s1++ = *s2++); //追加字符串直到'\0'
return ret;
}
int main()
{
char s1[20] = "hahaha";
char s2[] = "haokaixin";
printf("%s", my_strcat(s1, s2));
}
五、strstr()
char* strstr(const char* str1,const char* str2)
查询第一个子串中有没有第二个字符串(是否包含第二个字符串)
🍈模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strstr(char* s1, char* s2)
{
assert(s1 && s2);
char* pstr1 = s1;
char* pstr2 = NULL;
char* cur = pstr1; //指针当前位置
while(*cur)
{
pstr1 = cur;
pstr2 = s2;
while (*pstr1 == *pstr2)
{
pstr1++;
pstr2++;
if (*pstr2 == '\0') //如果pstr2是'\0'还没有跳出循环证明有子串
{
return cur;
}
}
cur++;
}
return NULL; //如果cur为’\0‘还没找到就返回空指针
}
int main()
{
char s1[] = "haohaoxuexi";
char s2[] = "hsaosdasfdi";
printf("%s", my_strstr(s1, s2));
}
完结
创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐