约 1954 字

约 10 分钟

#C 语言标准库函数 strstr

/*********************************************
 * @brief 在字符串中查找子字符串
 * @param str 被检索的字符串
 * @param substr 要查找的子串
 * @return 指向找到的字串的指针
 ********************************************/
char* strstr(const char* str, const char* substr);

说明

在字符串 str 中查找子字符串 substr,返回找到的第一个子字符串 substr 的地址。

参数

  • str - 被检索的字符串
  • substr - 要查找的子字符串

返回值

  • 指向找到的子字符串的指针
  • 如果没有找到目标子字符串,则返回 NULL

#示例

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

int main(void)
{
    const char* text = "一袋米要抗几楼(感受痛苦吧),一袋米要抗二楼(思考痛苦吧),一袋米要给多了(接受痛苦吧),一袋米我洗嘞(理解痛苦吧)。";
    const char* substr = "一袋米";

    const char* str = text;
    while ((str = strstr(str, substr)) != NULL) // 循环查找 "一袋米"
    {
        printf("地址:%p 偏移:%td 剩余字符串:\"%s\"\n", str, str - text, str + strlen(substr));
        str += strlen(substr);
    }

    return 0;
}

说明:

通过 strstr 循环查找子字符串 "一袋米" 直到返回 NULL。

运行结果:

地址:0x5cdf19f8e008 偏移:0 剩余字符串:"要抗几楼(感受痛苦吧),一袋米要抗二楼(思考痛苦吧),一袋米要给多了(接受痛苦吧),一袋米我洗嘞(理解痛苦吧)。"
地址:0x5cdf19f8e035 偏移:45 剩余字符串:"要抗二楼(思考痛苦吧),一袋米要给多了(接受痛苦吧),一袋米我洗嘞(理解痛苦吧)。"
地址:0x5cdf19f8e062 偏移:90 剩余字符串:"要给多了(接受痛苦吧),一袋米我洗嘞(理解痛苦吧)。"
地址:0x5cdf19f8e08f 偏移:135 剩余字符串:"我洗嘞(理解痛苦吧)。"

#推荐阅读

#参考标准

  • C23 standard (ISO/IEC 9899:2024):
    • 7.24.5.7 The strstr function (p: TBD)
  • C17 standard (ISO/IEC 9899:2018):
    • 7.24.5.7 The strstr function (p: 269)
  • C11 standard (ISO/IEC 9899:2011):
    • 7.24.5.7 The strstr function (p: 369)
  • C99 standard (ISO/IEC 9899:1999):
    • 7.21.5.7 The strstr function (p: 332)
  • C89/C90 standard (ISO/IEC 9899:1990):
    • 4.11.5.7 The strstr function

更新: 2025/10/25

作者: PlanC

创建: 2025/7/12