Указатель на индекс - функция strstr - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть упражнение, в котором я должен реализовать функцию strstr из стандартной библиотеки.Реализация strstr, похоже, работает, однако, хотя она указывает на «B», из «Foo Bar Baz» она возвращает «Bar Baz».Как я могу изменить возвращенный индекс, чтобы он возвращал только первое вхождение «B» «Bar» в «Foo Bar Baz»?

Из руководства:

Еслиигла - пустая строка, стог сена возвращается;если в стоге сена нигде нет иглы, возвращается NULL;в противном случае возвращается указатель на первый символ первого вхождения иглы.

#include <stdio.h>

char *ft_strstr(char *str, char *to_find) 
{
  int i;
  int n;

  i = 0;
  n = 0;
  if (to_find == NULL || str == NULL)
    return str;
  if (to_find != NULL) 
  {
    while (str[i] != '\0' && to_find[n] != '\0') 
    {
      while (str[i] == to_find[n]) 
      {
        i++;
        n++;
      }
      i++;
    }
    return str[i - n - 1];
  } 
  else
    return NULL;
}

int main() {
  char *largestring = "Foo Bar Baz";
  char *smallstring = "Bar";
  char *ptr;

  ptr = ft_strstr(largestring, smallstring);
  printf("%s", *ptr);
  return 0;
}

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Разница в том, что вы сообщаете, заключается не в том, что возвращается, а в том, что вы делаете с ним.Но сначала у вас есть некоторые ошибки:

  • return str[i - n - 1]; должно быть return &str[i - n - 1];
  • printf("%s", *ptr); должно быть printf("%s", ptr);
  • Вы возвращаете первый аргументесли второе значение равно NULL, вы должны в явном виде вернуть NULL в случае сбоя, в противном случае вызывающая сторона будет считать подстроку найденной.
  • Необходимо проверить, что возвращаемое значение не является NULL (не найдено), прежде чемвы разыменовываете его.

Вы можете напечатать результат, и, просто первый символ с

printf("%s\n", ptr);
printf("%c\n", *ptr);
0 голосов
/ 18 февраля 2019

Вы пытаетесь имитировать стандартную функцию strstr, но эта функция не выполняет то, что вы просили.На самом деле он возвращает указатель на первое вхождение str в to_find.Ваш текущий подход на самом деле правильный.

Однако есть две ошибки.Одна - это строка в ft_strstr:

return str[i - n - 1];

, которая должна быть:

return &str[i - n - 1];

Другая находится в main:

printf("%s", *ptr);

, котораядолжно быть

printf("%s", ptr);

Исправьте эти две вещи, и ваш код должен работать как следует.

Если needle - пустая строка, возвращается стог сена;если в стоге сена нигде нет иглы, возвращается NULL;в противном случае возвращается указатель на первый символ первого вхождения иглы.

Указатель по-прежнему всегда (если это не нулевой указатель) указывает где-то в стоге сена.Я думаю, это то, что вас смущает.

Может быть, этот фрагмент кода поможет вам:

char *largestring = "Foo Bar Baz";
char *smallstring = "Bar";
char *ptr = strstr(largestring, smallstring);
int index = ptr - largestring;

Переменная index теперь будет содержать индекс первого вхождения, в вашем случае это будетбыть 4. (Учитывая, что он был найден. В противном случае это может быть неопределенное поведение.)

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