对于学校,我必须重新创建 strstr 函数。我做到了,并且我尽可能地对其进行了测试,一切似乎都运行良好。
我仍在研究它,但经过几个小时的故障排除后,我不明白。有人能告诉我它与 strstr 相比有什么问题吗?
char *ft_strstr(char *str, char *to_find)
{
int i;
int k;
i = 0;
k = 0;
if (*to_find == 0)
return (str);
while (str[i] != 0)
{
while (str[i] == to_find[k])
{
i++;
k++;
if (to_find[k] == 0)
return (&str[i - k]);
}
i++;
k = 0;
}
return (0);
}
我应该包含一个主要用于测试吗?
谢谢。
编辑:这是机器的错误代码:
> $> ./0z09k44vyodiwxihua4w30m9 $> diff -U 3 user_output_test1
> test1.output | cat -e
> --- user_output_test1 2021-08-11 17:55:47.000000000 +0000$
> +++ test1.output 2021-08-11 17:55:47.000000000 +0000$ @@ -2,7 +2,7 @@$ 0$ -1$ 0$
> -7$
> +-1$ 0$ 2$ 2$ @@ -12,7 +12,7 @@$ -1$ -1$ -1$
> -87$
> +-1$ -1$ -1$ -1$
>
> Diff KO :( Grade: 0
最佳答案
这些 while 循环不正确
while (str[i] != 0)
{
while (str[i] == to_find[k])
{
i++;
k++;
if (to_find[k] == 0)
return (&str[i - k]);
}
i++;
k = 0;
}
假设 str
为 "aab"
,to_find
为 "ab"
。在这种情况下,内部 while 循环获得控制权,因为 str[0]
等于 tp to_find[0]
。在循环内,两个索引都会递增,并且 str[1]
不等于 to_find[1]
。因此循环中断其迭代,并且在循环之后索引i
再次递增并等于2
。所以不会找到子字符串。
您需要为内部 while 循环引入另一个索引。例如
while (str[i] != 0)
{
int j = i;
while (str[j] == to_find[k])
{
j++;
k++;
if (to_find[k] == 0)
return (&str[j - k]);
}
i++;
k = 0;
}
事实上,您只需要使用一个变量作为索引。循环可以重写为
for ( ; *str; ++str )
{
size_t i = 0;
while ( str[i] == to_find[i] )
{
if ( to_find[++i] == '\0' ) return str;
}
}
注意该函数有以下声明
char *strstr(const char *s1, const char *s2);
也就是说它的参数有限定符const
。
如果您以这种方式声明函数,那么 return 语句将如下所示
return ( char * )(&str[j - k]);
或
return ( char * )str;
如果使用上面所示的修改后的循环。
这是一个演示程序。
#include <stdio.h>
char * ft_strstr( const char *str, const char *to_find )
{
if ( *to_find == '\0' ) return ( char * )str;
for ( ; *str; ++str )
{
size_t i = 0;
while ( str[i] == to_find[i] )
{
if ( to_find[++i] == '\0' ) return ( char * )str;
}
}
return NULL;
}
int main(void)
{
char *p = ft_strstr( "aab", "ab" );
if ( p ) puts( p );
return 0;
}
程序输出为
ab
关于c - 我的 strstr 函数有效,但一个旨在测试它的程序说它不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68747133/