【问题标题】:C: my_strstr returning Needle when Needle is not found in HaystackC:当在 Haystack 中找不到 Needle 时,my_strstr 返回 Needle
【发布时间】:2015-12-25 03:45:55
【问题描述】:

我的第一个堆栈溢出问题,所以我希望它是正确的。

我制作了一个模拟 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); 
 }

当我编译它时,它适用于所有场景,除非在大海捞针中根本找不到针。事实上,在这种情况下,“Stb”(needle 的值)会出现在屏幕上。有人可以向我解释为什么会这样吗?提前谢谢!

【问题讨论】:

  • if (!s2) --> if (!s2 || !*s2) BTW:请使用描述性名称而不是 op a1 和 a2(gnu 使用 haystackneedle
  • s1++; : s1 已经变成了'\0',并通过++
  • @wildplasser 很好地考虑了指针和字符串为空或空的两种情况。我已经使用 haystack 和 needle 术语更新了问题。
  • 请不要更新问题。 [并且:您正在混合指针和数组语义。你为什么要针对'\0'0 进行测试而没有任何比较?]
  • @wildplasser 你能更详细地描述一下你的意思吗?

标签: c string pointers traversal pointer-arithmetic


【解决方案1】:

我刚刚写了相同的代码here。不要在您的my_strstr 中使用return (0) char *,它可以按您的示例的预期工作

【讨论】:

  • 感谢您发布您的代码,但是,在编译您编写的内容时,我没有得到预期的结果。事实上,我得到了一个新行,“在这个循环中”,最后是针的值,“Stb”。我试图按照您的思路创建一个 NULL 指针,以便在不匹配的情况下返回。但是“Stb”还是出现了。
  • 当我在同一个 IDE 中运行相同的代码时,它正在打印“dpes not exist”
  • 我不认为这样的问题是相关的,但看到我们的结果对比,我正在 x86_64_apple-darwin 13.4.0 上编译它
  • 我认为这也不相关。抱歉,帮不了你。
【解决方案2】:

感谢您的输入 @user1455116,但是您的代码在我的机器上产生了类似的错误。为了使其正常运行,我在第二个 while 循环之后添加了一个条件:

if (*str == '\0')
     return (0);

如果我们遍历了整个字符串,当然没有匹配。

【讨论】:

  • str 是什么意思?
【解决方案3】:

有人可以向我解释为什么会这样吗?

您的程序的行为是未定义的,因为它将从my_strstr() 返回的空指针ptr 传递给printf()。根据实现,可能会发生各种事情,包括打印(null)Segmentation fault,以及打印一些随机内存内容,这似乎是您的情况。可以通过检查生成的汇编代码来详细解释这一点。但是当然必须纠正错误,例如。 G。通过替换你的

    printf("%s\n", ptr);

    printf("%s\n", ptr ? ptr : "needle is not found at all in haystack");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多