请帮助制作strstr()

时间:2010-09-03 01:27:07

标签: c

我已经制作了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;
    }

3 个答案:

答案 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-str1result,否则您需要打印NULL(int*)*result毫无意义 - result应该是指向字符串的指针(或NULL

答案 2 :(得分:0)

您还需要更改此行:

if(*(s1+j)==*(s2+i))

到此:

if(*(s1+j)==*(s2+k))

如前所述,返回值有点奇怪。你正在返回一个char *但有点试图在其中放入一个整数值。结果在逻辑上没有意义。您应该返回指向找到它的位置的指针(不需要malloc)或返回整数位置(i)。但是返回整数位置不是“典型的”strstr实现。