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

Jun*_*n1o 20 c char

除了额外的参数之外,memchr()和之间的实际差异是什么strchr()?你什么时候使用其中一个?并且会有一个更好的结果的性能取代strchr()通过memchr(),如果解析大文件(从理论上说)?

jas*_*son 14

strchr当它遇到空字符时停止但memchr不会; 这就是为什么前者不需要长度参数而后者不需要长度参数的原因.


Jar*_*Par 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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • @JaredPar:这会从“pStr”开始遍历内存两次。 (2认同)

Bla*_*iev 2

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

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

  • 两者都可以搜索空字符。问题是“strchr”无法搜索*过去的空字符*。 (5认同)