本章重点:
重点介绍常用处理字符串的库函数的使用以及注意事项,并且模拟实现,便于更深刻的理解下列函数。
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)); }
完结
创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐