💓 博客主页:Kitten饭团的CSDN主页

          📁 文章专栏:C语言专栏

                                  期待您的关注 

目录

         一、strstr函数的基本概念 

1.1 函数定义 

1.2 功能描述

二、strstr函数的使用方法

2.1 基本用法示例

2.2 常用的场景

三、strstr函数的实现原理

四、strstr函数的注意事项 

4.1 空指针检查

4.2 字符串的终止符


string头文件其他相关库函数文章:C语言详细解读函数:strlen()函数

函数概念来自于网站http://cplusplus.com 

头文件为<string.h> 

一、strstr函数的基本概念 

1.1 函数定义 

函数的原型:

 

参数说明:  

🌈 函数参数str1的含义:要扫描的C字符串。

🌈 函数参数str2的含义:包含要匹配的字符序列的C字符串。

🌈 参数类型const char*的含义:表示传递的参数为char型的常目标指针。

1.2 功能描述

功能:定位子字符串。

实现原理:

🌈 返回指向 str1 中第一次出现 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针

🌈 匹配过程不包括终止空字符(\0),但会在那里停止。返回的是从匹配的子字符串开始到原字符串结束的部分

二、strstr函数的使用方法

2.1 基本用法示例

使用方法:

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[20] = "Hello world!";
    char str2[20] = "world";             //需要查找得字符串为"world"
    char *ret = strstr(str1, str2); 
    printf("ret == %s\n", ret);
    return 0;
}

 打印结果:

2.2 常用的场景

🌈 字符串搜索

char text[] = "This is a simple example.";
char keyword[] = "simple";
if (strstr(text, keyword) != NULL) 
{
    printf("Keyword found!\n");
} 
else 
{
    printf("Keyword not found.\n");
}

三、strstr函数的实现原理

内部实现机制:根据函数的基本概念来写一个自己的 strstr函数

示例代码:

#include <stdio.h>
#include <string.h>

/**
  * @brief  在指定的一个字符串中,找到一个子串
  * @note   None    
  * @param  str1:要扫描的C字符串
            str2:包含要匹配的字符序列的C字符串。
  * @retval 成功:返回指向找到的字符的指针
            失败:返回NULL
  */
const char* MyLib_StrStr(const char *str1, const char *str2)
{
    // 1、判断输入的两个字符串是否为NULL,为NULL就直接退出
    if (str1 == NULL || str2 == NULL) 
    {
        return NULL;
    }

    // 2、遍历str1字符串,找到所有可能
    while (*str1 != '\0') 
    {
        const char *current_str1 = str1;
        const char *current_str2 = str2;

        // 进入循环依次比较两个字符串的字符是否一致
        while (*current_str1 == *current_str2 && *current_str2 != '\0') 
        {
            current_str1++;
            current_str2++;
        }

        // 判断current_str2是否指向'\0',是的话,就意味着找到了str1中的子串str2
        if (*current_str2 == '\0') 
        {
            return str1;  // 返回str1中的子串的地址
        }

        str1++;
    }

    // 3、没有找到该子串,就返回NULL
    return NULL;
}

// 主函数
int main()
{
    // (1)、官方写的库 
    const char *s1 = "Hello,world!!!";
    const char *s2 = "world!";

    const char *p1 = strstr(s1, s2);
    printf("p1 == %s\n", p1);
    
    // (2)、自己写的库 
    const char *s3 = "Hello,world!!!";
    const char *s4 = "world!";

    const char *p2 = MyLib_StrStr(s3, s4);
    printf("p2 == %s\n", p2);
    
    return 0;
}

四、strstr函数的注意事项 

4.1 空指针检查

🌈 问题:如果传入的 str1 或 str2 是 NULL,strstr 的行为是未定义的,可能会导致程序崩溃。

🌈 解决方法:在使用 strstr 之前,确保输入的字符串指针不为 NULL。

示例:

if (*str2 == '\0') 
{
    // 处理空字符串的情况
    return str1;
}

4.2 字符串的终止符

🌈 问题:strstr 的匹配过程不包括终止的空字符(‘\0’),但它会在终止符处停止匹配。如果 str2 是空字符串(""),strstr 会返回 str1 的起始地址。

🌈 解决方法:如果 str2 可能是空字符串,需要特别处理。

示例:

if (*str2 == '\0') 
{
    // 处理空字符串的情况
    return str1;
}

strstr函数的内容到此结束了,要是有不足希望各位能够在评论区指出,要是文章对你有帮助,可以给个免费的赞和收藏💞💞💞  

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐