指向下标的指针-strstr函数

时间:2019-02-18 20:02:13

标签: c arrays pointers

我有一个练习,应该在标准库中实现strstr函数。 strstr的实现似乎可行,但是,尽管它指向“ B”,但它从“ Foo Bar Baz”返回“ Bar Baz”。如何更改返回的下标,使其仅返回“ Foo Bar Baz”中“ Bar”的“ B”的第一次出现?

从手册:

  

如果needle是一个空字符串,则返回干草堆;如果针在干草堆中无处发生,则返回NULL;否则返回NULL。否则,将返回指向第一次出现needle的第一个字符的指针。

#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 :(得分:1)

报告内容的不同之处在于,返回的不是返回值,而是处理方法。但是首先您会遇到一些错误:

  • 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);

答案 1 :(得分:0)

您正在尝试模仿标准的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;否则返回NULL。否则,将返回指向第一次出现needle的第一个字符的指针。

指针将始终(除非是空指针)指向大海捞针中的某个位置。我认为那是让您感到困惑的地方。

也许此代码段可以帮助您:

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

变量index现在将包含第一次出现的索引,在您的情况下,它将是4。(鉴于已找到它。否则可能是未定义的行为。)