Подтвердить что ты не робот

Различия между memchr() и strchr()

Какова фактическая разница между memchr() и strchr(), кроме дополнительного параметра? Когда вы используете тот или иной? и будет ли более эффективная производительность, заменяющая strchr() на memchr(), если синтаксический анализ большого файла (теоретически)?

4b9b3361

Ответ 1

strchr останавливается при достижении нулевого символа, но memchr не работает; поэтому первый не нуждается в параметре длины, но последний делает.

Ответ 2

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

Ответ 3

strchr ожидает, что первый параметр завершает нуль и, следовательно, не требует параметра длины.

memchr работает аналогично, но не ожидает, что блок памяти будет завершен до нуля, поэтому вы можете успешно искать символ \0.

Ответ 4

Нет реальной разницы, просто strchr() предполагает, что он просматривает строку с нулевым завершением (так что определяет размер).

memchr() просто ищет заданное значение до размера, переданного в.

Ответ 5

В практическом плане нет большой разницы. Кроме того, реализации могут сделать одну функцию быстрее другой.

Реальная разница возникает из контекста. Если вы имеете дело со строками, используйте strchr(). Если у вас есть конечный буфер без конца, используйте memchr(). Если вы хотите найти подмножество конечного размера строки, используйте memchr().