[ 基本难度系数 ]:★★★☆☆
一、函数strchr与strrchr
- 注意:
-
- 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c。
- strchr() 从左往右找,strrchr() 从右往左找。
- 字符串结束标记 ‘\0’ 被认为是字符串的一部分。
- 图解:
- 示例代码:
#include <stdio.h>
#include <string.h>
// 自己写的库
// 从左往右
char *MY_LIB_StrLchr(const char *s, int c)
{
// 1、如果传过来的字符串是空的,没有必要继续下面的判断了
if (s == NULL)
return NULL; // 失败,返回NULL
// 2、移动指针s并与c字符判断是否一致,一致就退出
while ( (*s != '\0') && (*s != c)) // 如果指针s一直找不到c字符就退出,或者找到c字符就退出
{
s++;
}
// 3、判断是结束符'\0',还是找到的字符c
if (*s == '\0')
return NULL;
else
return (char *)s;
}
// 从右往左
char *MY_LIB_StrRchr(const char *s, int c)
{
const char *tmp_p = s; // 记住最初的这个字符串的地址(也就是第一个字符)
// 1、如果传过来的字符串是空的,没有必要继续下面的判断了
if (s == NULL)
return NULL; // 失败,返回NULL
// 2、先将s指针移动到字符串的末尾
while (*s != '\0')
{
s++;
}
// 3、从右往左判断c是否存在
while ( (*s!=c) && (s != tmp_p)) // 如果指针s一直找不到c字符就退出,或者找到c字符就退出
{
s--;
}
// 3、判断是否是开始的那个地址tmp_p,还是找到的字符c
if (s == tmp_p)
return NULL;
else
return (char *)s;
}
// 主函数
int main(int argc, char const *argv[])
{
// (1)、官方写的库
// 1、strchr函数(从左往右找)
const char *s1 = "shijiename,woxiangainiqukankan";
int c1 = 'a';
char *p1 = strchr(s1, c1);
printf("p1 = %s\n", p1);
// 2、strrchr函数(从右往左找)
const char *s2 = "shijiename,woxiangainiqukankan";
int c2 = 'a';
char *p2 = strrchr(s2, c2);
printf("p2 = %s\n", p2);
// (2)、自己写的库
// 1、MY_LIB_Strchr函数(从左往右找)
const char *s3 = "shijiename,woxiangainiqukankan";
int c3 = 'a';
char *p3 = MY_LIB_StrLchr(s3, c3);
printf("p3 = %s\n", p3);
// 2、MY_LIB_StrRchr函数(从右往左找)
const char *s4 = "shijiename,woxiangainiqukankan";
int c4 = 'a';
char *p4 = strrchr(s4, c4);
printf("p4 = %s\n", p4);
// 应用领域:查找字符在字符串的位置,通常是为了分析数据
return 0;
}
二、函数strstr
- 图解:
- 示例代码:
#include <stdio.h>
#include <string.h>
// 自己写的库
char *MY_LIB_StrStr(const char *haystack, const char *needle)
{
// 初始化
const char *tmp_p1 = haystack;
const char *tmp_p2 = needle;
const char *p1 = haystack;
const char *p2 = needle;
// 1、判断输入的两个字符串是否为NULL,为NULL就直接退出
if ( (haystack == NULL) || (needle == NULL) )
{
return NULL;
}
// 2、遍历haystack字符串,找到所有可能
while ( *tmp_p1 != '\0')
{
// 在进去之前,将p1和p2的最初的位置进行保留
p1 = tmp_p1;
p2 = tmp_p2;
// 进入循环一次比较两个字符串的字符是否一致,防止比较的字符串在末尾
while ( (*p1 == *p2) && (*p1 != '\0') && (*p2 != '\0'))
{
p1++;
p2++;