1.功能
<cstring>
(这表示strstr这个函数是包含在头文件·<string.h>,具体解析见网址)
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
查找子字符串
返回指向 str1 中 str2 第一次出现的指针,如果 str2 不是 str1 的一部分,则返回 null 指针。
匹配过程不包括终止 null 字符,但到此为止。
(这是我从c++库中寻找的功能描述,网址:C library - C++ Reference (cplusplus.com))
2.代码实操
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcccde";
char arr2[] = "ccd";
printf("%s\n", strstr(arr1, arr2));
return 0;
}
运行以上代码,打印结果为ccde。
具体过程为从字符串arr1(也就是abcccde)中找到字符串arr2(也就是ccd),并返回指向arr1中arr2第一次出现的指针(也就是arr1中ccd中的第一个c的地址(指针))。
当arr2中字符串改为 (空格,这时arr2[0]=' ',arr2[1]='\0')时,明显arr1中不存在,这时打印结果为(null)。
3.strstr函数的不足
以上与C++库中描述的一致,但是当我们运行以下代码时:
#include<stdio.h>
#include<stdio.h>
int main()
{
char arr1[] = "abcccde";
char arr2[] = "";
printf("%s\n", strstr(arr1, arr2));
return 0;
}
这里打印结果为abcde(我使用的是visual studio 2022),我们对arr2的定义为空(null)(没有空格),明显strstr返回结果也应该为(null),可是却直接返回了arr1的地址。
(以上调试结果可以验证我的猜想。)
这表明strstr函数对数据处理的不足。
4.strstr的模拟实现
以下是我对strstr函数的模拟实现
#include<stdio.h>
#include<string.h>
const char* my_strstr(const char* s1, const char* s2)
{
//if (*s2 == NULL)
// return s1;
//要使效果与strstr一样加上这个就行了
while (*s1)
{
if (*s1 == *s2)
{
char* s3 = s1;
char* s4 = s2;
while (*s3++ == *s4++)
{
if (*s4 == '\0')
return s1;
}
}
s1++;
}
return NULL;
}
int main()
{
char arr1[] = "abcccde";
char arr2[] = "";
printf("%s\n", my_strstr(arr1, arr2));
return 0;
}
这个代码当arr2为(null)时,my_strstr会返回(null),与C++库中描述的一致,并无差异。
5.总结
(以上结果与观点均为调试运行后所得,并非空口无凭,感兴趣的可以自己尝试。)
对比,尝试,然后寻找差异并加深理解。(如有错误还请指出)