Функционально нет разницы в том, что они оба сканируют массив / указатель на предмет заданного значения.Версия 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
можно использовать для поиска нулевого терминаторав строке.Это определенно не оптимальная реализация, потому что она обходит память дважды.Но это служит для демонстрации того, насколько близки оба в функциональности.