C:my_strstr在Haystack中找不到Needle时返回Needle

时间:2015-09-27 23:24:24

标签: c string pointers traversal pointer-arithmetic

我的第一个堆栈溢出问题,所以我希望它形成良好。

我做了一个模拟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" - 针的值 - 显示在屏幕上。有人可以向我解释为什么会这样吗?提前谢谢!

3 个答案:

答案 0 :(得分:0)

我刚刚编写了相同的代码herereturn (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");