C语言中,memmem
函数用于在内存区域中定位特定字节序列。它可以被看作是专门用于以空字符结尾的字符串的strstr
函数。
为什么这个函数作为GNU扩展而不是直接包含在标准库中?手册中指出:
这个函数在Linux库中一直存在问题,直到libc 5.0.9版本(包括该版本),其中needle和haystack参数被交换,并返回指向第一个出现的needle末尾的指针。
新旧的libc都有一个错误,即如果needle为空,则返回haystack-1(而不是haystack)。而glibc 2.0则更糟糕,返回指向haystack最后一个字节的指针。这在glibc 2.1中得到了修复。
我看到它经历了几个修复,但我想知道为什么它没有像某些发行版上的strstr
函数那样被直接提供(如果不是更多)。它仍然会带来实现问题吗?
编辑(动机):如果标准是反过来决定的:包括memmem
但不包括strstr
,那么我就不会提出这个问题。实际上,strstr
可以是以下内容:
memmem(str, strlen(str), "search", 6);
有点棘手,但仍然是一个相当“逻辑”的一行代码,考虑到在C函数中通常需要同时要求数据块和其长度。
编辑(2):来自评论和答案的另一个动机。引用Theolodis的话:
并非每个函数都对每个C开发人员都必要,或者至少大多数开发人员都必要,因此标准库实际上会使得库变得不必要巨大。
好吧,我完全同意,当涉及到使库更轻、更快时,我总是参与其中。但是...为什么既有strncpy
又有memcpy
(来自keltar的评论)...?我差点可以问:为什么可怜的memmem
被“黑羊化”了呢?
strstr
是标准的。 - John WH Smith