const char* My_strstr(const char *long_str,const char short_str)
{
int long_str_i = 0;
int short_str_i = 0;
const char start = NULL;
while ((long_str[long_str_i] != '\0') && (short_str[short_str_i] != '\0')) //判断长字符和短字符是否接收到‘\0’
{
//外循环
start = &long_str[long_str_i]; //定义从那个地方开始
while (long_str[long_str_i] == short_str[short_str_i]) //内循环
{
long_str_i++;
short_str_i++;
}
if (short_str[short_str_i] == '\0') //如果短字符接收到'\0'返回到起始位
{
return start;
}
start++;
long_str_i=long_str_i+1; //长字符往后偏移
//short_str_i =short_str+1;
//short_str_i=0;//段字符串停止
}
return NULL; //返回
}
这是判断短字符串是否在长字符中,并返回在长字符串中的位置吗?
(1)外层while中的条件不需要判断短字符串。
(2)每次循环,short_str_i 需要重置为0
(3)内层while需要判断长字符和短字符串是否已经到结尾。
代码修改如下:
#include <stdio.h>
const char* My_strstr(const char *long_str,const char* short_str)
{
int long_str_i = 0;
int short_str_i = 0;
const char *start = NULL;
while ((long_str[long_str_i] != '\0') ) //判断长字符和短字符是否接收到‘\0’
{
//外循环
start = &long_str[long_str_i]; //定义从那个地方开始
short_str_i = 0;//这里重置0
while (long_str[long_str_i]!='\0' &&short_str[short_str_i] !='\0' && long_str[long_str_i] == short_str[short_str_i]) //内循环
{
long_str_i++;
short_str_i++;
}
if (short_str[short_str_i] == '\0') //如果短字符接收到'\0'返回到起始位
{
return start;
}
//start++;//这一句没用
long_str_i=long_str_i+1; //长字符往后偏移
//short_str_i =short_str+1;
//short_str_i=0;//段字符串停止
}
return NULL; //返回
}
完整代码及测试代码如下:
#include <stdio.h>
const char* My_strstr(const char *long_str,const char* short_str)
{
int long_str_i = 0;
int short_str_i = 0;
const char *start = NULL;
while ((long_str[long_str_i] != '\0') ) //判断长字符和短字符是否接收到‘\0’
{
//外循环
start = &long_str[long_str_i]; //定义从那个地方开始
short_str_i = 0;//这里重置0
while (long_str[long_str_i]!='\0' &&short_str[short_str_i] !='\0' && long_str[long_str_i] == short_str[short_str_i]) //内循环
{
long_str_i++;
short_str_i++;
}
if (short_str[short_str_i] == '\0') //如果短字符接收到'\0'返回到起始位
{
return start;
}
//start++;//这一句没用
long_str_i=long_str_i+1; //长字符往后偏移
//short_str_i =short_str+1;
//short_str_i=0;//段字符串停止
}
return NULL; //返回
}
int main()
{
char longstr[100],shortstr[20];
const char* p;
scanf("%s %s",longstr,shortstr);
p = My_strstr(longstr,shortstr);
printf("%s",p);
return 0;
}
short_str_i每次循环应该归零
另外long_str_i的变化也是错误的
按照你的代码逻辑尽量保持,那么修改如下:
const char* My_strstr(const char *long_str,const char *short_str)
{
int long_str_i = 0;
int short_str_i = 0;
const char *start = NULL;
while ((long_str[long_str_i] != '\0') && (short_str[short_str_i] != '\0')) //判断长字符和短字符是否接收到‘\0’
{
//外循环
start = &long_str[long_str_i]; //定义从那个地方开始
while (long_str[long_str_i] != '\0' && (long_str[long_str_i] == short_str[short_str_i])) //内循环
{
long_str_i++;
short_str_i++;
}
if (short_str[short_str_i] == '\0') //如果短字符接收到'\0'返回到起始位
{
return start;
}
long_str_i=start-long_str+1; //长字符往后偏移--------但原先直接在long_str_i基础上加1是不对的,因为上方的while循环会修改long_str_i的值,所以只能用start来处理
short_str_i=0; //---------------------short_str_i每轮比较结束后应该重新置为0
start++;
}
return NULL; //返回
}
int main()
{
char s1[100],s2[50];
const char *p = NULL;
gets(s1);
gets(s2);
p = My_strstr(s1,s2);
if(p==NULL)
printf("无子串");
else
printf("子串起点:%d",p-s1);
return 0;
}
#include <stdio.h>
const char *my_strstr(const char *str, const char *substr)
{
while (*str)
{
const char *p = str;
const char *q = substr;
while (*p && *q && *p == *q)
{
p++;
q++;
}
if (*q == '\0')
return str;
str++;
}
return NULL;
}
#define N 50
int main()
{
char str[N], substr[N];
while (scanf("%s%s", str, substr) == 2)
{
const char *p = my_strstr(str, substr);
if (p)
printf("find substr at index %ld\n", p - str);
else
printf("str does not contain substr.\n");
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!