我的第一个堆栈溢出问题,所以我希望它形成良好。
我做了一个模拟strstr的简单函数:
char *my_strstr(char *haystack, char *needle)
{
int i;
if (!needle || !*needle)
return (haystack); // if s2 is empty
while (*haystack != '\0')
{
i = 0;
while (*haystack != *needle && *haystack != '\0')
haystack++;
while (haystack[i] == needle[i] && haystack[i] != '\0')
i++;
if (needle[i] == '\0')
return (haystack);
haystack++;
}
return (0);
}
为了测试它,我有以下主要内容:
int main(void)
{
char *haystack = "Stacy Lives Next Door Fool";
char *needle = "Stb";
char *ptr;
ptr = my_strstr(haystack, needle);
printf("%s\n", ptr);
return (0);
}
当我编译它时,它适用于每个场景,除非在haystack中根本找不到针。事实上,就是这样的情况" Stb" - 针的值 - 显示在屏幕上。有人可以向我解释为什么会这样吗?提前谢谢!
答案 0 :(得分:0)
我刚刚编写了相同的代码here。 return (0)
中char *
的{{1}} my_strstr
,{{1}}无法正常运行
答案 1 :(得分:0)
感谢您输入@ user1455116,但是您的代码在我的机器上产生了类似的错误。为了使其正常运行,我在第二个while循环后添加了一个条件:
if (*str == '\0')
return (0);
如果我们经历了整个字符串,当然没有匹配。
答案 2 :(得分:0)
有人可以向我解释为什么会这样吗?
程序的行为未定义,因为它将从ptr
返回的空指针my_strstr()
传递给printf()
。根据实现情况,可能会发生各种各样的事情,包括打印(null)
,Segmentation fault
以及打印一些随机内存内容,这似乎就是您的情况。人们可以通过检查生成的汇编代码来详细解释这一点。但当然必须纠正错误,例如: G。通过替换你的
printf("%s\n", ptr);
与
printf("%s\n", ptr ? ptr : "needle is not found at all in haystack");