首页 > 解决方案 > C 中的字符串(strstr 函数)

问题描述

我正在尝试重现该函数的行为,该strstr()函数试图在字符串中查找子字符串,为此我创建了以下函数并将其与原始函数进行比较。我在纸上进行了所有迭代以了解函数中发生了什么,但我不明白为什么命令return (&str[i]);打印ab而不是a. 当函数进入时,和if (to_find[j] == '\0')的值是i和,所以它应该只是打印,也就是。为什么要打印而不是 just ?j22&str[2]aaba

#include <stdio.h>
#include <unistd.h>
#include <string.h>

char    *ft_strstr(char *str, char *to_find)
{
    int i;
    int j;

    i = 0;
    if (*to_find == '\0')
        return (str);
    while (str[i] != '\0')
    {
        j = 0;
        while (str[i + j] == to_find[j])
        {
            //printf("%d", i);
            //printf("%d\n", j);
            j++;
            if (to_find[j] == '\0')
                return (&str[i]);
        }
        i++;
    }
    return (0);
}

int main()
{
    char i[] = "ab";
    char dest[] = "a ab";
    printf("%s", ft_strstr(dest, i));
    //printf("%s", strstr(dest, i));
}

标签: cc-stringsfunction-definitionstrstr

解决方案


return (&str[i]);这是做什么的:

  • str[i]这与 相同*(str+i)。这意味着获取str指向的地址,添加i到它并获取它的值。
  • &x表示获取地址x
  • (&str[i])是上面2个的组合。这意味着获取str指向的地址,添加i到它并获取它的值,然后获取该值的地址。这意味着最后两个步骤相互抵消,你得到:获取str指向的地址,添加i到它。它与 相同(str+i)
  • return 语句只是意味着返回这个指针。

现在,在您调用后,您将ft_strstr(dest, i)获得此指针。在您的情况下,此指针指向字符串中的第二个 a "a ab"。你给这个指针,printf()并用"%s"你告诉printf()打印这个指针指向的字符串,直到有一个'\0'-byte。'b'不是'\0'-byte 所以它也会被打印出来。

调用时返回的指针指向此处printf()

          V
+---+---+---+---+---+
| a |   | a | b |\0 |
+---+---+---+---+---+

printf()然后将检查它是否指向一个'\0'-byte,这是错误的,所以字节('a')被打印出来并且指针递增。然后对字节 ( 'b') 执行相同的操作,然后它指向'\0',这意味着printf()在这里停止。


推荐阅读