我已经制作了strstr()函数,但程序没有给出任何输出,只是一个空白的屏幕。请看一下代码。
#include<stdio.h>
#include<conio.h>
const char* mystrstr(const char *str1, const char *str2);
int main()
{
const char *str1="chal bhai nikal";
const char *str2="nikal",*result;
result=mystrstr(str1,str2);
printf("found at %d location",(int*)*result);
getch();
return 0;
}
const char * mystrstr(const char *s1, const char *s2)
{
int i,j,k,len2,count=0;
char *p;
for(len2=0;*s2!='\0';len2++);//len2 becomes the length of s2
for(i=0,count=0;*s1!='\0';i++)
{
if(*(s1+i)==*s2)
{
for(j=i,k=0;*s2!='\0';j++,k++)
{
if(*(s1+j)==*(s2+i))
count++;
if(count==len2)
{
p=(char*)malloc(sizeof(char*));
*p='i';
return p;
}
}
}
}
return NULL;
}
答案 0 :(得分:5)
此评论的行:
//len2 becomes the length of s2
坏了。您反复检查s2
的第一个字符。而不是*s2
,请尝试s2[len2]
。
编辑:正如其他人所说,这种实施显然有很多问题。如果你想要天真的,强力的strstr
算法,这里有一个简洁快速的版本:
char *naive_strstr(const char *h, const char *n)
{
size_t i;
for (i=0; n[i] && h[i]; i++)
for (; n[i] != h[i]; h++) i=0;
return n[i] ? 0 : (char *)h;
}
答案 1 :(得分:3)
看起来这是一项练习,你要学习更多有关算法和C字符串和指针的知识,所以我不会为你解决这些问题,但这里有一些起点:
len2
时有一个无限循环(您的循环条件为*s2
,但您永远不会更改s2
)for
循环中遇到了类似的问题,虽然我有一个早期return
所以它可能不是无限的,但我怀疑条件是否正确strstr()
,你应该返回一个指向第一个字符串的指针,而不是你分配的新指针。您没有理由在strstr。main()
中,如果您要计算找到的字符串的位置,则除非result-str1
为result
,否则您需要打印NULL
。 (int*)*result
毫无意义 - result
应该是指向字符串的指针(或NULL
)答案 2 :(得分:0)
您还需要更改此行:
if(*(s1+j)==*(s2+i))
到此:
if(*(s1+j)==*(s2+k))
如前所述,返回值有点奇怪。你正在返回一个char *但有点试图在其中放入一个整数值。结果在逻辑上没有意义。您应该返回指向找到它的位置的指针(不需要malloc)或返回整数位置(i
)。但是返回整数位置不是“典型的”strstr实现。