在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开发人员,所以它实际上会使标准库变得非常庞大。
嗯,我不能同意,我总是在使图书馆更轻,更快。但那么......为什么strncpy
和memcpy
(来自keltar的评论)......?我几乎可以问:为什么穷人memmem
已经&#34;黑色&#34;?
答案 0 :(得分:1)
从历史上看,这是在标准的第一次修订之前,C由编译器编写者完成。
在strstr
的情况下,它有点不同,因为它已由C委员会介绍,C89理由文件告诉我们:
&#34;
strstr
功能是委员会的一项发明。它作为高效算法的钩子或内置子串指令包含在内。&#34;
C委员会没有解释为什么它没有提供更一般的功能,不仅限于字符串,所以任何推理都可能只是猜测。我唯一的猜测是,用例被认为不够重要,不能使用通用memmem
而不是strstr
。请记住,在C的目标中有这个要求(在C99基本原理中)&#34;保持语言小而简单&#34; 。甚至POSIX也没有考虑将其纳入其中。
在任何情况下,据我所知,没有人提出任何包含memmem
的缺陷报告或建议。