реализация функции strstr () - PullRequest
0 голосов
/ 24 августа 2010

Во многих местах код говорит «недопустимое косвенное обращение». Пожалуйста, помогите.

   int main()
    {

        char *s1,*s2,*position;
        printf("Enter string:\n");
        gets(s1);
        printf("Enter word to find:\n");
        gets(s2);
        *position=ststr(*s1,*s1);
        if(*position)
        printf("word is found at %c loc\n",*position);
        else
        printf("word not found");
        getch();
        return 0;

    }

char *strstr(char *s1,char *s2)
{
    int flag=1;
    char i,j;
    for(i=0; ;i++)
    {
        if(*s1[i]==*s2[0])
        for(j=i;*s2;j++)
        {
            if(*s1[j]!=*s2[j])
            flag=0;
        }

    }
    if(flag)
    return i;
    else
    return 0;
}

Ответы [ 6 ]

6 голосов
/ 24 августа 2010

Во-первых, s1 и s2 в main не были инициализированы, чтобы указывать на что-либо значимое. Либо объявите их как статические массивы, либо выделите им память во время выполнения, используя malloc() или calloc():

#define SIZE 20 // or some number big enough to hold your input
...
char s1[SIZE], s2[SIZE], *position; // s1 and s2 declared statically

Второе, НИКОГДА НИКОГДА НИКОГДА НИКОГДА НИКОГДА НИКОГДА использовать gets(); это будет вводить точку отказа в вашей программе. Используйте fgets() вместо:

if (fgets(s1, sizeof s1, stdin) != NULL)
  // process s1
else
  // check for EOF or error on read

EDIT

И, как все остальные отметили, ваше сравнение в функции strstr() должно быть либо

*s1 == *s2

или

s1[i] == s2[i]

но сначала вам нужно разобраться с правильным размещением буферов в main.

2 голосов
/ 24 августа 2010
if(*s1[i]==*s2[0])

- это такой пример, когда мой gcc жалуется:

error: invalid type argument of ‘unary *’ (have ‘int’)

, если s1 - указатель на char, s1[i] - символ. Так что вы не можете dereference это больше (с *), то есть s1[i] больше ни на что не указывает.

Попробуйте

if(s1[i]==s2[0])

вместо.


Вам также следует изменить возвращаемое значение strstr: вы возвращаете целое число, в котором вы объявляете, что возвращаете указатель на символ. Поэтому попробуйте вернуть s1+i.


Это здесь:

for(j=i;*s2;j++)

вероятно, не то, что вы хотите. Вы не перемещаете указатель s2 в любом месте цикла, фактически вы просто проверяете, равен ли s2[0] (что совпадает с *s2) нулю для каждой итерации. Если s2 не пустая строка, этот цикл никогда не прекратится.

1 голос
/ 12 января 2017
#include "stdio.h"
char *strstr(char *str, char *substr)
{
    int len = strlen(substr);
    char *ref = substr;
    while(*str && *ref)
    {
        if (*str++ == *ref)
        {
            ref++;
        }
        if(!*ref)
        {
            return (str - len);
        }
        if (len == (ref - substr))
        {
            ref = substr;
        }
    }
    return NULL;
}

int main(int argc, char *argv[])
{
  printf("%s \n", strstr("TEST IS NOT DONE", "IS NOT"));
}
1 голос
/ 25 июня 2013
#include <stdio.h>

char* my_strstr(char *s2, char *s1)
{
  int i, j;
  int flag = 0;

  if ((s2 == NULL || s1 == NULL)) return NULL;

  for( i = 0; s2[i] != '\0'; i++)
  {
    if (s2[i] == s1[0])
    {
      for (j = i; ; j++)
      {
        if (s1[j-i] == '\0'){ flag = 1; break;}
        if (s2[j] == s1[j-i]) continue;
        else break;
      }
    }
    if (flag == 1) break;
  }

  if (flag) return (s2+i);
  else return NULL;
}

int main()
{
  char s2[] = "This is the statement";
  char s1[] = "the";
  char *temp;

  temp = my_strstr(s2,s1);

  printf("%s\n",temp);
  return 0;
}
1 голос
/ 24 августа 2010

Одна из проблем, которую я замечаю, это когда вы делаете *s1[j]. Звездочка разыменовывает массив, как и запись [].

s[i] действительно означает *(s + i), поэтому вам не нужно разыменовывать его снова. То, как вы это делаете, будет читать **(s + i), и так как это единственный указатель, вы не сможете этого сделать.

1 голос
/ 24 августа 2010
         if(*s1[j]!=*s2[j]) 
  • *s1 означает «символ, на который указывает s1».
  • s1[j] означает «*(s1+j)» или «позиция j после символа, на который указывает s1»

Вы должны использовать один или другой;не оба.

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