遇到行return str + i - j;
时,为什么此程序会导致分段错误?我以为我很好地理解了指针概念,但我明显错过了一些东西,我无法理解它。
#include <stdio.h>
char* ft_strstr(char* str, char* to_find)
{
int i;
int j;
i = 0;
while (str[i] != '\0')
{
j = 0;
while (str[i] == to_find[j] && str[i] != '\0' && to_find[j] != '\0')
{
i++;
j++;
}
if (to_find[j] == '\0')
return str + i - j;
else
i = i - j;
i++;
}
return (0);
}
int main()
{
char a[] = "fffo";
char b[] = "ffo";
char* f = ft_strstr(a,b);
if (f)
printf("%s\n", f);
return (0);
}
答案 0 :(得分:4)
如果你的意图是在另一个字符串中找到一个字符串,你应该只查看标准strstr
函数,因为它正是它的意思。
但是,如果您的目的是学习如何调试代码,最好的办法是坐下来拿一张纸:
i j str to_find
----- ----- -------------- ------------
0 1 2 3 4 0 1 2 3 <- indexes
? ? f f f o \0 f f o \0
并逐行运行该代码,随时更新变更变量。
没有什么比手动单步执行代码更清楚了。
答案 1 :(得分:0)
一切正常。毕竟,它与指针无关,我的不好,抱歉。问题是我实际上有两个单独的文件(main.cpp和ft_strstr.c)。即使未在main.cpp文件中声明ft_strstr()
的原型,在使用gcc main.cpp ft_strstr.c
进行编译时,链接器也没有引发任何错误,而且当我运行已编译的可执行文件时,它似乎是导致分段错误。奇怪的是,该功能正在执行(我知道,因为我试图从ft_strstr()
制作一些打印件。)