系列文章目录
深度剖析:strcat & strncat
深度剖析:strchr & strstr
深度剖析:strcmp & strncmp
深度剖析:strcpy & strncpy
深度剖析:strlen & strtok
深度剖析:memcpy & memmove
深度剖析:memset & memcmp
前言
库函数string是我们经常使用也是非常重要的代码,我将会对常用的函数的用法和实现原理进行深度剖析
一、strchr
1.调用结构
char *strchr(char *s, char c);
2.使用详解
strchr:在参数 s 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的地址
原理详解:
- 遍历整个字符串查找指定字符
- 如果找到返回该字符的地址
- 如果没找到返回空指针NULL
3.源码剖析
char *Strchr(char *s, char c) {
//查找字符:在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的地址
assert(s); //防止传入空指针
while (*s != '\0' && *s != c) { //遍历字符串
++s;
}
return *s == c ? s : NULL; //找到了返回该字符的地址,没找到返回NULL
}
二、strstr
1.调用结构
char *strstr(char const *s1, char const *s2);
2.使用详解
strstr:在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置
原理详解:
- 遍历整个字符串查找指定字符串
- 如果找到对应的字符,则以该字符为起点的一段字符进行字符串比较
- 如果相等返回这段字符串起点的地址
- 如果不想等则继续遍历直到结束
- 若最终未找到对应的字符串则返回空指针NULL
3.深度剖析
char *Strstr(char const *s1, char const *s2) {
//查找字符串:在字符串 s1 中查找第一次出现字符串 s2(不包含空结束字符)的位置
assert(s1 && s2); //防止传入空指针
char const *start1 = s1;
char const *start2 = s2;
while (*(s1 = start1++)) { //遍历s1
for (s2 = start2; *s1 == *s2; s1++, s2++) { //遍历s2与s1比较
if (*(s2 + 1) == '\0') { //如果s2与s1的一部分均相等
return (char *)start1; //返回start1记录的s1的地址
}
}
}
return NULL; //如果遍历s1均未找到则返回NULL
}