C 返回字符时出现分段错误*
当行C 返回字符时出现分段错误*,c,pointers,C,Pointers,当行返回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_fin
返回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);
}
#包括
char*ft\u strstr(char*str,char*to\u 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++;
}
如果(找到[j]='\0')
返回str+i-j;
其他的
i=i-j;
i++;
}
返回(0);
}
int main()
{
字符a[]=“fffo”;
字符b[]=“ffo”;
char*f=ft_strstr(a,b);
如果(f)
printf(“%s\n”,f);
返回(0);
}
如果您想在另一个字符串中找到一个字符串,您只需查看标准的strstrstr
函数,因为这正是它的用途
但是,如果您的目的是学习如何调试代码,那么最好的办法就是坐下来拿一张纸,这样:
i j str to_find
----- ----- -------------- ------------
0 1 2 3 4 0 1 2 3 <- indexes
? ? f f f o \0 f f o \0
i j str要查找
----- ----- -------------- ------------
0 1 2 3 4 0 1 2 3如果您在这里的目的是在另一个字符串中查找一个字符串,那么您只需查看标准的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
i j str要查找
----- ----- -------------- ------------
011234040123一切正常。毕竟这和指针无关,我的错,对不起。问题是我实际上有两个单独的文件(main.cpp和ft_strstr.c)。即使未在main.cpp文件中声明ft_strstr()
的原型,使用gcc main.cpp ft_strstr.c
进行编译时,链接器也没有出现任何错误,并且在运行编译后的可执行文件时,它似乎导致了分段错误。但奇怪的是,函数正在执行(我知道,因为我试图从ft\u strstrstr()
)进行一些打印)。一切正常。毕竟这和指针无关,我的错,对不起。问题是我实际上有两个单独的文件(main.cpp和ft_strstr.c)。即使未在main.cpp文件中声明ft_strstr()
的原型,使用gcc main.cpp ft_strstr.c
进行编译时,链接器也没有出现任何错误,并且在运行编译后的可执行文件时,它似乎导致了分段错误。但奇怪的是,函数正在执行(我知道,因为我试图从ft\u strstrstr()
)进行一些打印)。那里没有返回0
?这看起来很可疑……在GCC编译器中,您的程序运行良好。@cuvidk:我现在无法测试它,但您当前的代码看起来不错。你可以调试它,看看i
和j
的值是什么,以及它们是如何变化的。你没有返回0
吗?这看起来很可疑……在GCC编译器中,您的程序运行良好。@cuvidk:我现在无法测试它,但您当前的代码看起来不错。你可以调试它,看看i
和j
的值是什么,以及它们是如何变化的。我知道有一个函数已经做到了这一点。这就是为什么这个函数的原型与那个函数如此相似。我只需要写一些类似的东西,就这样。其次,在本例中不调用返回(0)
。遇到的return语句是returnstr+i-j代码>。检查打印件,您将看到。和关于返回(0)
,它是故意放在那里的,因为
中的str
函数在未找到序列时返回NULL
指针。@cuvidk,我只是说,由于您盲目地printf
返回值,如果找不到字符串,返回值将很糟糕,因此,我声明您的呼叫代码应该考虑到这一点。我会尽量说清楚的。它本身并不是函数的问题。为了确定函数的问题,您需要调试技巧,我正试图传授:-)我更改了它:DAnd,现在,我已将答案更改为适合:-)FWIW,这在我的gcc和我的头脑中都起作用,因此您可能希望确保您发布/正在编译正确的代码。我知道有一个函数已经做到了这一点。这就是为什么这个函数的原型与那个函数如此相似。我只需要写一些类似的东西,就这样。其次,在本例中不调用返回(0)
。遇到的return语句是returnstr+i-j代码>。检查打印件,您将看到。和关于返回(0)
,它是故意放在那里的,因为
中的str
函数在未找到序列时返回NULL
指针。@cuvidk,我只是说,由于您盲目地printf
返回值,如果找不到字符串,返回值将很糟糕,因此,我声明您的呼叫代码应该考虑到这一点。我会尽量说清楚的。它本身并不是函数的问题。为了确定函数的问题,您需要调试技巧,我正在尝试传授:-)我更改了它:DAnd,现在,我已经更改了我的答案以适应:-)FWIW,它在我的gcc和我的头脑中都起作用,因此您可能希望确保发布/编译了正确的代码。