strstr через указатели на языке c - PullRequest
1 голос
/ 10 сентября 2010

это стандартный код для strstr, который я сделал ????

char* fstrset(char *s,char *t)
{
    int b, i=0,j=0;

 while(*(s+i)!='\0')
 {
  if(*(t+j)=='\0')
   break;
  else if(*(s+i)==*(t+j))
   {
   i++;j++;b=1;
   }
  else
   { i++;b=0;j=0;
   }
 }

    if(b==0)
     return((char*)NULL);
    else if(b==1)
     return(s+i-j);
}

Ответы [ 9 ]

4 голосов
/ 10 сентября 2010

Это все, что стандарт говорит об этом:

7.21.5.7 Функция strstr

Синопсис

 #include <string.h> 
char *strstr(const char *s1, const char *s2); 

Описание

Функция strstr находит первый вхождение в строке, на которую указывает s1 последовательности символов (исключая завершающий ноль символ) в строке, на которую указывает s2.

Возвращает

Функция strstr возвращает указатель на найденный строка или нулевой указатель, если Строка не найдена. Если s2 указывает на строка с нулевой длиной, функция возвращает s1.

Похоже, вы не указали * аргументы const в аргументах.

Что касается стиля, обратите внимание, что *(ptr+index) можно заменить на ptr[index], и size_t - лучший тип для индексации указателя.

Что касается распространенного способа его реализации, сравните с кодом GCC:

char *
strstr (const char *s1, const char *s2)
{
  const char *p = s1;
  const size_t len = strlen (s2);

  for (; (p = strchr (p, *s2)) != 0; p++)
    {
      if (strncmp (p, s2, len) == 0)
    return (char *)p;
    }
  return (0);
}
2 голосов
/ 10 сентября 2010

Ваш код содержит ошибки. Дано:

char *haystack = "fififi-trixabelle";
char *needle = "fifi-trixabelle";

fstrset(haystack, needle) возвращает неправильно возвращается NULL.

1 голос
/ 10 сентября 2010

Помимо ошибки, упомянутой caf, есть и другие:

1) Неинициализированный б. Если s указывает на '\0', может быть достигнута закрывающая скобка, без каких-либо операторов возврата.

2) Если символы совпадают до конца строки, на которую указывает s, проверка на то, заканчивается ли строка, указанная на t, также не выполняется.

0 голосов
/ 10 февраля 2014
    char *strstr(const char *s1, const char *s2) {
      char *a = s1, *b = s2;
      for (;;)
        if      (!*b)          return (char *)s1;
        else if (!*a)          return NULL;
        else if (*a++ != *b++) {a = ++s1; b = s2;}
    }
0 голосов
/ 10 сентября 2010
char* fstrstr(char *s1,char *s2)
{
 int i=0,flag=0;
 char *s4,*s3;
// s4 for retaining the value of s2
 s4 = s2;
 while(*s1 != '\0' && *s2 != '\0')
 {
  if(*s1 == *s2)
  {
   *(s3+i) = *s1;
   s2++;
   s1++;
   i++;
   flag = 1;
  }
  else
  {
   i = 0;
   s1++;
//   Initialize s2 again from its address
   s2 = s4;
   flag = 0;
  }
 }
 if(flag == 1)
 {
  while(*s1 != '\0')
  {
   *(s3+i) = *s1;
   i++;
   s1++;
  }
  *(s3+i) = '\0';
 }
 if(flag == 1)
  return (s3);

 if(flag==0)
 {
  *s3 = NULL;
  return (s3);
 }
}
0 голосов
/ 10 сентября 2010

Стандартного кода не существует, только стандартный результат.

Маловероятно, что любая реализация в стандартной библиотеке C использует индексирование массива, поэтому маловероятно, чтобы ваш код соответствовал какой-либо реализации построчно.

0 голосов
/ 10 сентября 2010

быстрое чтение, кажется, показывает, что код работает (возможно, есть крайние случаи, которые не работают). Вы говорите нам, это работает?

Но зачем это делать? просто позвоните strstr

0 голосов
/ 10 сентября 2010
inline char* strstr(char* __s1, const char* __s2)
{
    return __builtin_strstr(const_cast<const char*>(__s1), __s2); 
}
0 голосов
/ 10 сентября 2010

Что это делает? Это похоже на бред. Зачем добавлять указатели и смешивать их с целыми числами? Извините, но все это не имеет смысла.

И чтобы ответить на ваш вопрос, я так не думаю. Но если вы скомпилируете его и он запустится, тогда да.

Хорошо, ваш код имеет смысл, когда вы смотрите на него ближе. Да, похоже, что он скомпилируется, если вы это подразумеваете под стандартным кодом.

...