实现c语言中的strstr函数

函数功能:

函数形式为:const char * strstr ( const char * str1, const char * str2 );

参数:

        str1指向一个字符串;str2指向一个字符串;

内容:

        在str1所指向的字符串中查找str2所指向的字符串;

返回值:

        找到了:返回str1所指向的字符串中与str2所指向的字符串相等的字符串的首字符的地址

        没找到:返空指针NULL

举个例子:

                 

         此代码中 p1为字符串s1中b的地址,即s1+1

                        p2为NULL

函数实现:

 思路:

                 

        假设这里有两个字符串,s1,s2指向首字符地址,先拿asv和abc比较,不相等则s1++;

                 

         接着再拿svk和abc比较,不相等又s1++;这样看来这是一个循环,哪循环什么时候结束呢?

                

         当s1指向这儿时,abc和abc相等,返回a的地址,即return s1;

                 

         或者没找到相等的字符串时返回NULL,即*s1 == '\0'时return NULL;

代码实现:

const char* my_strstr(const char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1)//循环查找,直到s1指向'\0',退出循环
	{
		//找到了就return s1;
		s1++;
	}
	return NULL;//s1都指向'\0'了还没找到,就说明没有,返回空指针
}

现在来实现中间的比较部分,

                

         先拿*s1和*s2比较,如果相等则s1++;s2++;不相等则结束,显然这也是一个循环,循环条件是*s1         == *s1,

                 

         假如*s1和*s2一直相等,则当*s2 == '\0'时相当于找到了相同的字符串,此时return a的地址;

        这时就有一个问题了,我们每一次循环查找时如果没找到则s1++,再继续查找.但是我们在比较            时把s1改变了,显然比较时s1和s2不能改变,如何解决这个问题呢?代码如下

                

         我在每一次查找比较的开头用指针p1和p2来接收s1和s2的值,比较时用p1和p2就没问题了,

        代码如下:

const char* my_strstr(const char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1)//循环查找,直到s1指向'\0',退出循环
	{
		char* p1 = s1;
		char* p2 = s2;
		while (*p1++ == *p2++)
		{
			if (*p2 == '\0')
				return s1;
		}
		//找到了就return s1;
		s1++;
	}
	return NULL;//s1都指向'\0'了还没找到,就说明没有,返回空指针
}
int main()
{
	char s1[] = "abcdef";
	char s2[] = "bcd";
	char s3[] = "xyz";
	char* p1 = my_strstr(s1, s2);
	char* p2 = my_strstr(s1, s3);

	if (NULL == p1)
		printf("没找到\n");
	else
		printf("%s\n", p1);

	if (NULL == p2)
		printf("没找到\n");
	else
		printf("%s\n", p2);

	return 0;
}

运行结果:

                 

 以上就是我实现strstr函数的过程,我也是一位初学者,如有错误欢迎指出.

 

 

<think>好的,我现在需要帮助用户了解C语言strstr函数的用法。首先,我得回忆一下strstr函数的基本功能和用法。strstr函数用于在字符串中查找子字符串的首次出现位置,返回指向该位置的指针,如果找不到则返回NULL。用户可能想知道如何声明这个函数,参数是什么,以及如何使用它。 接下来,我应该参考用户提供的引用内容。根据引用[1],函数的声明是char *strstr(const char *str1, const char *str2),需要包含头文件string.h。引用[2]中的示例展示了如何使用strstr查找子字符串并用strncpy修改内容,这可以帮助用户理解实际应用。引用[3]提到了函数原型,可能还涉及实现细节。 用户可能需要分步骤的说明,包括函数声明、参数解释、返回值、使用示例和注意事项。比如,参数str1是主字符串,str2是子字符串,返回值是指针,需要注意空指针和字符串结束符的问题。示例部分可以展示查找成功和失败的情况,以及如何操作找到的指针。 另外,用户可能对内存修改的例子感兴趣,比如引用[2]中的strncpy修改内存块内容。这需要解释找到子字符串后如何操作指针,并注意不要越界。同时,需要提醒用户在使用返回的指针前检查是否为NULL,避免程序崩溃。 还要考虑生成相关问题,可能涉及strstr实现原理、与类似函数的区别(如strchr)、性能分析或者常见错误。比如,如何自己实现strstr函数,或者处理多次查找的情况。 最后,确保回答符合格式要求:行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式。用中文回答,结构清晰,分步骤说明,引用标记正确,示例代码用正确格式,然后生成相关问题。</think>### C语言strstr函数使用说明 #### 一、函数声明 ```c #include <string.h> char *strstr(const char *str1, const char *str2); ``` 函数在`string.h`头文件中定义,用于在字符串`str1`中查找子字符串`str2`的首次出现位置[^1][^3]。 #### 二、参数说明 1. `str1`:被搜索的主字符串(需以`\0`结尾) 2. `str2`:需要查找的子字符串(需以`\0`结尾) #### 三、返回值 - 找到时:返回指向`str1`中首次出现`str2`位置的指针 - 未找到时:返回`NULL` - 当`str2`为空字符串时:返回`str1`的起始地址 #### 四、使用示例 ```c #include <stdio.h> #include <string.h> int main() { char text[] = "Learn C programming with examples"; char *result = strstr(text, "program"); if (result != NULL) { printf("找到位置:%ld\n", result - text); // 输出:找到位置:7 printf("匹配位置后的内容:%s\n", result); // 输出:programming with examples } else { printf("未找到子串\n"); } return 0; } ``` #### 五、内存操作应用 通过`strstr`定位后可直接操作内存(需注意内存边界)[^2]: ```c char str[] = "Original string for modification"; char* pos = strstr(str, "string"); if (pos) { strncpy(pos, "BYTES", 5); // 修改找到的位置内容 printf("%s\n", str); // 输出:Original BYTES for modification } ``` #### 六、注意事项 1. 两个输入字符串都必须以`\0`结尾 2. 修改字符串时应确保目标内存可写(不能是字符串常量) 3. 返回的指针有效性依赖于原字符串的生命周期 4. 建议先进行NULL检查再使用返回值
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值