c - 我的 strstr 函数有效,但一个旨在测试它的程序说它不起作用

标签 c while-loop c-strings function-definition strstr

对于学校,我必须重新创建 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/

相关文章:

python - 忽略特定时间内的异常情况

c - 练习题

C 未知长度字符串的二维数组,访问元素时崩溃

c++ - std::assert 发生了什么

c - C语言逐行查找文件中的单词

c - C 程序中的 sbrk 函数和指针

php - 否则如果不在 php 中工作

java - 函数陷入循环

c - C语言计算字符串中每个单词的长度的程序

c - 两个地点有什么区别?