memmem是GNU扩展的特殊原因吗?

时间:2014-06-17 12:16:45

标签: c memory gnu

在C中,memmem函数用于定位存储区中的特定字节序列。它可以被同化为strstr,它专用于以空字符结尾的字符串。

此功能是否有任何特殊原因可用作GNU扩展,而不是直接在标准库中?手册说明:

  

此功能在Linux库中被破坏,包括libc 5.0.9;在那里,针和干草堆的参数互换了,并且返回了第一次出现针的末尾的指针。

     

旧的和新的libc都有错误,如果针是空的,则返回haystack-1(而不是haystack)。并且glibc 2.0使情况变得更糟,返回指向haystack的最后一个字节的指针。这在glibc 2.1中已得到修复。

我可以看到它经历了几次修复,但我想知道为什么它在某些发行版中没有作为strstr直接可用(如果不是更多)。它是否仍然存在实施问题?

编辑(动机):如果标准反过来决定,我不会问这个问题:包括memmem但不是strstr。的确,strstr可能是这样的:

memmem(str, strlen(str), "search", 6);

稍微有点棘手,但仍然是一个漂亮的逻辑单行,考虑到在C函数中通常需要数据块及其长度< / em>的

编辑(2):来自评论和答案的另一个动机。引用Theolodis

  

并非每个功能都是必需的,或者至少是大多数C开发人员,所以它实际上会使标准库变得非常庞大。

嗯,我不能同意,我总是在使图书馆更轻,更快。但那么......为什么strncpymemcpy(来自keltar的评论)......?我几乎可以问:为什么穷人memmem已经&#34;黑色&#34;?

1 个答案:

答案 0 :(得分:1)

从历史上看,这是在标准的第一次修订之前,C由编译器编写者完成。

strstr的情况下,它有点不同,因为它已由C委员会介绍,C89理由文件告诉我们:

  

&#34; strstr功能是委员会的一项发明。它作为高效算法的钩子或内置子串指令包含在内。&#34;

C委员会没有解释为什么它没有提供更一般的功能,不仅限于字符串,所以任何推理都可能只是猜测。我唯一的猜测是,用例被认为不够重要,不能使用通用memmem而不是strstr。请记住,在C的目标中有这个要求(在C99基本原理中)&#34;保持语言小而简单&#34; 。甚至POSIX也没有考虑将其纳入其中。

在任何情况下,据我所知,没有人提出任何包含memmem的缺陷报告或建议。