自定义strstr函数的实现C语言

本文探讨如何在C语言中实现strstr功能,通过详细解析函数的实现过程,帮助读者理解字符串查找的底层逻辑。

strstr功能

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2str1中首次出现的地址;否则,返回NULL。

strstr实现

#include<stdio.h>
#include<assert.h>
const char* my_strstr(const char *str1, const char *str2)
{
    assert(str1 != NULL);
    assert(str2 != NULL</
<think>我们正在讨论C语言中的strstr函数 问题:c语言strstr函数 回答: 在C语言中,`strstr`函数用于在一个字符串(haystack)中查找另一个子字符串(needle)的首次出现位置。 ### 函数原型 ```c char *strstr(const char *haystack, const char *needle); ``` ### 参数说明 - `haystack`:被搜索的主字符串(以空字符'\0'结尾)。 - `needle`:要查找的子字符串(以空字符'\0'结尾)。 ### 返回值 - 如果找到子字符串,返回指向主字符串中第一次出现子字符串位置的指针。 - 如果未找到,返回空指针(NULL)。 ### 示例代码 ```c #include <stdio.h> #include <string.h> int main() { const char *str = "Hello, world!"; const char *sub = "world"; char *result = strstr(str, sub); if (result != NULL) { printf("找到子字符串:'%s',位置:%ld\n", sub, result - str); } else { printf("未找到子字符串:'%s'\n", sub); } return 0; } ``` ### 注意事项 1. **大小写敏感**:`strstr`是区分大小写的,例如在"Hello"中查找"hello"会失败。 2. **空字符串处理**:如果`needle`是空字符串,则返回`haystack`(因为空字符串被视为存在于任何字符串的开始处)。 3. **效率**:`strstr`函数的时间复杂度在最坏情况下可能达到O(n*m)(n和m分别是两个字符串的长度)。在需要高效搜索时,可以考虑更优的算法(如KMP算法)。 ### 安全提醒 使用`strstr`时需确保两个参数都是有效的以空字符结尾的字符串,否则可能导致未定义行为(如内存访问越界)。 --- §§相关问题§§ 1. 如何实现一个自定义strstr函数? 2. C语言中除了strstr还有哪些常用的字符串查找函数? 3. 为什么strstr函数在查找空字符串时返回原字符串的起始地址? 4. 如何用strstr函数实现不区分大小写的子字符串查找? 5. 在什么情况下使用strstr函数可能导致程序安全问题?</think>### C语言中的`strstr`函数详解 `strstr`是C标准库(`<string.h>`)中的**字符串查找函数**,用于在目标字符串中定位子串的首次出现位置。 --- #### 函数原型 ```c char *strstr(const char *haystack, const char *needle); ``` - **`haystack`**:被搜索的主字符串(目标字符串) - **`needle`**:需要查找的子字符串 - **返回值**: - 找到子串 → 返回指向**主串中子串起始位置**的指针 - 未找到子串 → 返回 `NULL` --- #### 关键特性 1. **大小写敏感** 区分大小写(例如 `"Hello"` 中查找 `"hello"` 返回 `NULL`) 2. **空字符串处理** 若 `needle` 是空字符串(`""`),返回 `haystack` 的首地址 3. **匹配规则** 精确匹配整个子串(如 `"apple"` 中查找 `"app"` 返回匹配位置) 4. **终止条件** 遇到 `'\0'` 停止搜索(不会越界访问) --- #### 示例代码 ```c #include <stdio.h> #include <string.h> int main() { char text[] = "C programming is powerful!"; char *result = strstr(text, "pro"); if (result != NULL) { printf("找到子串!位置:%ld\n", result - text); // 输出:找到子串!位置:2 printf("匹配内容:%s\n", result); // 输出:programming is powerful! } else { printf("未找到子串\n"); } return 0; } ``` --- #### 注意事项 1. **参数有效性** 必须保证 `haystack` 和 `needle` 以 `'\0'` 结尾,否则引发未定义行为 2. **效率问题** 最坏时间复杂度为 O(n*m)(n和m为两字符串长度),大文本搜索时需谨慎 3. **替代方案** 需要不区分大小写时,可用自定义实现或平台特定的 `strcasestr()`(非C标准) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值