strstr
函数是 C 语言标准库中的一个非常有用的字符串处理函数,它用于在一个字符串中查找另一个字符串首次出现的位置。以下是对 strstr
函数的详细解析:
一、函数原型
strstr
函数的原型定义在 <string.h>
头文件中,其基本语法如下:
char *strstr(const char *str1, const char *str2);
二、参数说明
str1
:指向要搜索的主字符串的指针。这是要在其中查找子字符串的字符串。str2
:指向要查找的子字符串的指针。这是要在主字符串中搜索的子字符串。
三、返回值
- 如果
strstr
函数在str1
中找到了str2
,则返回一个指向str1
中str2
首次出现位置的指针。这个位置是从str1
的开头计数的,并指向str2
的第一个字符在str1
中的位置。 - 如果
strstr
函数在str1
中没有找到str2
,则返回NULL
指针。
四、使用场景
- 查找子字符串:
strstr
最直接的应用就是在一个较长的字符串中查找一个较短的子字符串,并返回其首次出现的位置。 - 判断子字符串存在性:可以通过检查
strstr
的返回值是否为NULL
来判断一个字符串是否是另一个字符串的子串。
五、示例代码
以下是一个简单的示例,展示了如何使用 strstr
函数:
#include <stdio.h> | |
#include <string.h> | |
int main() { | |
const char *haystack = "Hello, World!"; | |
const char *needle = "World"; | |
char *result = strstr(haystack, needle); | |
if (result != NULL) { | |
printf("Found substring: %s\n", result); // 输出从找到的位置开始到 haystack 结尾的字符串 | |
// 也可以输出子串在主串中的位置 | |
printf("'%s' first appears at position %ld\n", needle, result - haystack); | |
} else { | |
printf("Substring not found.\n"); | |
} | |
return 0; | |
} |
在这个示例中,strstr
函数查找子字符串 "World"
在主字符串 "Hello, World!"
中的首次出现,并返回指向该位置的指针。然后,程序打印出从该位置开始到主字符串结尾的字符串,并计算出子串在主串中的位置(从 0 开始计数)。
六、注意事项
strstr
函数是区分大小写的。如果需要忽略大小写进行搜索,可以使用自定义函数或第三方库中的函数,如strcasestr
(在某些平台上可用)。- 返回的指针指向的是
str1
中的一个位置,因此它不会创建一个新的字符串或复制找到的子字符串。 - 当
str2
为空字符串(""
)时,strstr
会立即返回str1
的起始位置。 - 由于
strstr
返回一个指针,因此可以使用它来访问或操作找到的子字符串及其后面的字符。但是,要注意不要越界访问字符串的末尾或未初始化的内存区域。
七、模拟实现库函数strstr
//模拟库函数strstr
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
const char* cur = str1; //用cur用来记录当前的位置
const char* s1 = NULL; //通过s1 和 s2 比较元素
const char* s2 = NULL;
assert(str1 && str2); //assert断言,如果传入的地址有有一个会空指针,则直接返回str1的地址
if (str2 == '\0')
return (char*)str1;
while (*cur) //当cur中的值不为'\0'时,进入循环
{
s1 = cur; //s1回到比较时的位置
s2 = str2; //s2回到初始位置
while (*s1 && *s2 && *s1 == *s2) //当s1和s2指向的值相等时,进入循环
{
s1++; //找到下一个元素
s2++; //找到下一个元素
//再次比较
}
if (*s2 == '\0') //当s2中的元素为'\0'时,则说明在str1中找到了str2
return (char*)cur; //返回当前的位置
cur++; //第一次没找到,找到下一个元素重新寻找
}
return NULL; //如果在循环中没有找到,则返回一个空指针
}
int main()
{
char arr1[] = "abcadefdef";
char arr2[] = "def";
char* ret = my_strstr(arr1, arr2);
if (ret != NULL)
{
printf("%s\n", ret);
}
else
{
printf("找不到\n");
}
return 0;
}