пожалуйста помогите сделать strstr () - PullRequest
2 голосов
/ 03 сентября 2010

Я сделал функцию 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 ]

5 голосов
/ 03 сентября 2010

Строка с этим комментарием:

//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;
}
3 голосов
/ 03 сентября 2010

Похоже, это упражнение, которое вы делаете, чтобы узнать больше об алгоритмах, а также о строках и указателях Си, поэтому я не буду решать эти проблемы за вас, но вот некоторые отправные точки:

  • У вас есть бесконечный цикл при расчете len2 (ваше условие цикла *s2, но вы никогда не меняете s2)
  • У вас похожая проблема со вторым циклом for, хотя у вас ранний return, поэтому он может быть не бесконечным, но я сомневаюсь, что условие правильное
  • Если вы хотите вести себя как strstr(), вы должны возвращать указатель на первую строку, а не новый указатель, который вы выделяете. У вас нет причин выделять во время функции, подобной strstr.
  • В main(), если вы хотите вычислить позицию найденной строки, вы хотите вывести result-str1, если result не равен NULL). (int*)*result не имеет смысла - result должен быть указателем на строку (или NULL)
0 голосов
/ 03 сентября 2010

Вам также необходимо изменить эту строку:

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

к этому:

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

Как уже упоминалось, возвращаемое значение немного странно. Вы возвращаете char *, но пытаетесь поместить в него целочисленное значение. Результат не имеет смысла логически. Вы должны либо вернуть указатель на место, где он найден (malloc не требуется), либо вернуть целочисленную позицию (i). Но возвращение целочисленной позиции не является «типичной» реализацией strstr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...