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