实现自己的查找子串功能,需求在字符串中查找对应的子串,如果有返回字符串第一个字母的位置,如果没有返回-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;
}
- 返回局部变量地址
- 不可以释放野指针