查找子串及指针的易错点

实现自己的查找子串功能,需求在字符串中查找对应的子串,如果有返回字符串第一个字母的位置,如果没有返回-1

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//优化思路  memcmp( str,substr,3) == 0

int myStrstr( char * str , char * subStr )
{
	int num = 0;
	while (*str != '\0')
	{
		if (*str != *subStr)
		{
			str++;
			num++;
			continue;
		}

		//创建临时指针
		char * tmpStr = str;
		char * tmpSubStr = subStr;

		while ( *tmpSubStr !='\0')
		{
			if (*tmpStr != *tmpSubStr)
			{
				//匹配失败
				str++;
				num++;
				break;
			}
			tmpStr++;
			tmpSubStr++;
		}

		if (*tmpSubStr == '\0')
		{
			//匹配成功
			return  num;
		}
	}

	return -1;
}
void test01()
{
	char * str = "abcdefgdnf";

	int ret = myStrstr(str, "dnf");

	if (ret == -1)
	{
		printf("未找到子串\n");
	}
	else
	{
		printf("找到了子串,位置为:%d\n", ret);
	}

}
int main(){

	test01();

	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

  • 指针容易越界操作
  • 指针叠加会不断改变指针指向
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void test01()
{
   char * p = malloc(sizeof(char)* 64);

   //利用临时指针 操作里面的内存
   char * pp = p;
   for (int i = 0; i < 10;i++)
   {
	   *pp = i + 97;
	   printf("%c", *pp);
	   pp++; //申请的首地址指针偏移后,就不可以利用这个指针释放堆区内存了
   }

   if (p != NULL)
   {
	   free(p);
	   p = NULL;
   }
}

int main(){
	test01();


	system("pause");
	return EXIT_SUCCESS;
}
  • 返回局部变量地址
  • 不可以释放野指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值