strstr
和 find
都是用于查找子串的函数,但它们来自不同的库,使用方式、返回值和适用场景有所不同。
所属库和适用对象
函数 | 所属库 | 适用对象 |
---|---|---|
strstr | C 标准库 (<cstring> ) | C 风格字符串 (char* 或 const char* ) |
find | C++ 标准库 (<string> ) | C++ std::string 类 |
strstr
是 C 语言函数,用于处理以 \0
结尾的字符数组(C 字符串)。
find
是 C++ std::string
的成员函数,用于操作 std::string
对象。
strstr
参数:haystack
:被搜索的主字符串。
needle
:要查找的子串。
返回值:如果找到子串,返回子串首次出现的地址(指针)。如果没找到,返回 NULL
。
示例:
输出:Found at position: 7
解释上面的代码:
char * result = strstr(s1,s2):在s1字符串中找s2字符串第一次出现的位置,并返回该地址。用指针 result 接收。
result-s1:作用是计算子串在主串中的索引位置(即第几个字符开始),s1
和 result
都是 const char*
类型(字符指针),它们的减法运算表示两个指针之间的偏移量(即相隔多少个 char
元素)。上述代码:result=&s1[7] s1=&s1[0] result-s1=7。
!!!如果直接输出result,会直接打印内存地址,即s1[7]的地址。
find
参数:str
或 s
:要查找的子串(可以是 std::string
或 C 风格字符串)。
pos
(可选):从哪个位置开始查找(默认从头开始,即0)。
返回值:如果找到子串,返回子串首次出现的索引位置(size_t
类型)。如果没找到,返回 std::string::npos
(一个特殊常量,通常是 -1
或最大无符号数)。
示例:
Found at position: 7
!!!find直接返回索引位置。用size_t类型接收。
!!!是否是子串判断时使用 std::string::npos。
总结
特性 | strstr (C) | find (C++) |
---|---|---|
适用对象 | char* (C 风格字符串) | std::string (C++ 字符串) |
返回值 | 返回指针(地址) | 返回索引(size_t ) |
未找到返回值 | NULL | std::string::npos |
安全性 | 可能越界(无边界检查) | 更安全(自动管理长度) |
性能 | 稍快(直接操作内存) | 稍慢(封装了额外逻辑) |
如何选择?推荐优先使用 find
,除非必须处理 C 风格字符串或追求极致性能。
用 strstr
:
处理 C 风格字符串(如 char[]
或 char*
)。
需要高性能(如嵌入式系统或底层代码)。
用 find
:
使用 C++ std::string
。
需要更安全的字符串操作(避免缓冲区溢出)。
需要直接获取子串位置(索引比指针更直观)。