memchr()和strchr()之间的区别

时间:2010-11-23 19:42:20

标签: c char

除了额外的参数外,memchr()strchr()之间的实际差异是多少?你什么时候使用其中一个?如果解析一个大文件(从理论上讲),是否会有更好的结果性能替换strchr() memchr()

5 个答案:

答案 0 :(得分:14)

strchr在遇到空字符时停止,但memchr没有;这就是前者不需要长度参数而后者不需要的原因。

答案 1 :(得分:9)

在功能上没有区别在于它们都扫描数组/指针以获得提供的值。 memchr版本只需要一个额外的参数,因为它需要知道提供的指针的长度。 strchr版本可以避免这种情况,因为它可以使用strlen来计算字符串的长度。

如果您尝试使用char*存储二进制数据strchr,则可能会弹出差异,因为它可能无法查看字符串的全长。对于具有二进制数据和char*函数的几乎任何str*都是如此。对于非二进制数据,尽管它们实际上是相同的功能。

您实际上可以很容易地用strchr代码memchr

const char* strchr(const char* pStr, char value) {
  return (const char*)memchr(pStr, value, strlen(pStr)+1);
}

此处需要+1,因为strchr可用于在字符串中查找空终止符。这绝对不是一个最佳实现,因为它会将内存走两次。但它确实有助于证明两者在功能上的接近程度。

答案 2 :(得分:2)

strchr期望第一个参数以空值终止,因此不需要长度参数。

memchr的工作方式类似但不期望内存块以空值终止,因此您可能正在成功搜索\0个字符。

答案 3 :(得分:1)

没有真正的区别,只是strchr()假设它正在查看以null结尾的字符串(以确定大小)。

memchr()只是查找给定的值,直到传入的大小。

答案 4 :(得分:-2)

实际上,没有太大区别。此外,实现可以自由地使一个函数比另一个更快。

真正的区别来自背景。如果您正在处理字符串,请使用strchr()。如果您有一个有限大小的非终止缓冲区,则使用memchr()。如果要搜索字符串的有限大小子集,请使用memchr()