c - C 中的字符串(strstr 函数)
问题描述
我正在尝试重现该函数的行为,该strstr()
函数试图在字符串中查找子字符串,为此我创建了以下函数并将其与原始函数进行比较。我在纸上进行了所有迭代以了解函数中发生了什么,但我不明白为什么命令return (&str[i]);
打印ab
而不是a
. 当函数进入时,和if (to_find[j] == '\0')
的值是i
和,所以它应该只是打印,也就是。为什么要打印而不是 just ?j
2
2
&str[2]
a
ab
a
#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));
}
解决方案
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()
在这里停止。
推荐阅读
- c# - 始终使用 ExcelDataReader 从 Excel 文件中以字符串形式获取数据
- mysql - 实体框架 MySql:未从数据库中读取 DbGeometry
- .htaccess - 使用 .htaccess 删除多个 url 的尾部斜杠
- javascript - 致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足错误
- php - Laravel 仅获取多对多关系中的枢轴列
- symfony - 检查实体属性是否存在
- java - 奇怪的 Java 日历不一致
- java - 如何处理列表的每个 Future 的结果以及所有 future 在 vert.x 中完成的时间?
- rest - Xamarin 移动设备到存储在 AWS Ec2 上的 SQLite
- c++ - 获取未定义符号:__asan_memset 尝试使用 Clang 地址清理程序时