Чистая байтовая версия strstr?

Есть ли версия strstr, которая работает с фиксированной длиной памяти, которая может включать нулевые символы?

Я мог бы сформулировать свой вопрос так: strncpy для memcpy, как strstr для?


person brian    schedule 02.01.2010    source источник
comment
Лучше вы можете написать новую программу на c, чтобы иметь такую ​​функциональность. не думаю, что это будет сложно.   -  person Vijay    schedule 02.01.2010


Ответы (3)


memmem, к сожалению, он специфичен для GNU, а не для стандартного C. Однако он имеет открытый исходный код, поэтому вы можете скопировать код (если лицензия вам подходит).

person Community    schedule 02.01.2010

Нет в стандартной библиотеке (которая не так уж велика, так что взгляните). Однако написать свой собственный - тривиально, либо напрямую побайтно, либо с помощью memchr (), за которым следует memcmp () итеративно.

person Clifford    schedule 02.01.2010
comment
+1, мне нравится идея использовать memchr и memcpy. Вы можете дословно взять реализацию strstr и заменить все str-функции их аналогами в памяти. - person quinmars; 03.01.2010
comment
Хорошие реализации strstr вовсе не тривиальны - они используют сложные алгоритмы, чтобы работать намного, намного быстрее, чем тривиальный алгоритм. Например, вот ядро ​​реализации в GNU libc: bazaar.launchpad.net/~vcs-imports/glibc/master/view/head:/ - person Greg Price; 10.09.2015
comment
@GregPrice: Я вовсе не предполагаю, что стандартная библиотека strstr() обязательно тривиальна; просто то, что функциональность, требуемая OP, может быть тривиально реализована, даже если обычно оптимальное решение не так. Реализации стандартных библиотек должны быть в высшей степени оптимизированы, поскольку их применение заранее не известно. При написании кода, специфичного для приложения, он должен быть достаточно быстрым (или маленьким) только для удовлетворения потребностей приложения. В этом конкретном случае реализация, подобная вашему примеру, может быть неоправданной. - person Clifford; 10.09.2015

В стандартной библиотеке нет. Однако быстрый поиск в Google по запросу "безопасная библиотека строк c" дает несколько потенциально полезных результатов. Не зная больше о задаче, которую вы пытаетесь выполнить, я не могу рекомендовать какую-либо конкретную стороннюю реализацию.

Если это единственная «безопасная» функция, которая вам нужна помимо стандартных функций, то, возможно, лучше использовать собственную, чем тратить усилия на интеграцию сторонней библиотеки, при условии, что вы уверены, что можете сделать это, не вводя дополнительные ошибки.

person Adam    schedule 02.01.2010
comment
Я не вижу в этом вопросе слова «безопасно». - person ; 02.01.2010
comment
Вы правы, что я немного иначе трактовал вопрос. Широкое прочтение может включать нули может привести к предположению, что оно также не может включать нули. Поскольку отсутствие нулевого завершения является серьезной проблемой, которая заставляет людей рассматривать strncpy() (и, действительно, strlcpy()), мне показалось целесообразным обратиться к моему ответу с этого направления, поскольку другие ответы уже охватывали другие подходы. Я попытался отметить это, заявив, что не зная больше о задаче ... Я не могу рекомендовать какую-либо конкретную стороннюю реализацию. Возможно, я мог бы быть более ясным. - person Adam; 02.01.2010