C语言中strstr的使用和模拟实现(我发现了strstr中一个不足?)

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.总结

(以上结果与观点均为调试运行后所得,并非空口无凭,感兴趣的可以自己尝试。)

对比,尝试,然后寻找差异并加深理解。(如有错误还请指出)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值