我有一个练习,应该在标准库中实现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;
}
答案 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。(鉴于已找到它。否则可能是未定义的行为。)