繁体   English   中英

指向下标的指针— strstr函数

[英]Pointer to subscript — strstr function

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

从手册中:

如果needle是一个空字符串,则返回干草堆。 如果针在干草堆中无处发生,则返回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;
}

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

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

您试图模仿标准的strstr函数,但是该函数无法满足您的要求。 实际上,它确实返回了指向to_find第一次出现strto_find 您当前的方法实际上是正确的。

但是,有两个错误。 一个是ft_strstr这一行:

return str[i - n - 1];

应该是:

return &str[i - n - 1];

另一个main

printf("%s", *ptr);

那应该是

printf("%s", ptr);

修复这两件事,您的代码应该可以正常工作。

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

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

也许此代码段将帮助您:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM