2010-01-02 13 views
10

¿Hay una versión de strstr que funcione en una longitud fija de memoria que puede incluir caracteres nulos?¿Una versión de bytes puros de strstr?

Pude formular mi pregunta de esta manera: strncpy es memcpy como strstr es?

+1

Mejor puede escribir un nuevo programa c para tener dicha funcionalidad. no creo que sea algo complejo. – Vijay

Respuesta

14

memmem, lamentablemente es específico de GNU en lugar de C estándar. Sin embargo, es de código abierto para que pueda copiar el código (si la licencia es susceptible para usted).

7

No en el standard library (que no es tan grande, así que échele un vistazo). Sin embargo, escribir uno es trivial, ya sea directamente byte por byte o usando memchr() seguido de memcmp() iterativamente.

+0

+1, me gusta la idea de usar memchr y memcpy. Puede tomar una implementación strstr literalmente y reemplazar todas las funciones str con sus contrapartes. – quinmars

+0

Las buenas implementaciones de strstr no son para nada triviales: usan sofisticados algoritmos para trabajar mucho, mucho más rápido que un algoritmo trivial. Por ejemplo, aquí está el núcleo de la implementación en GNU libc: http://bazaar.launchpad.net/~vcs-imports/glibc/master/view/head:/string/str-two-way.h –

+0

@GregPrice: I Estoy sugiriendo que la biblioteca estándar 'strstr()' es necesariamente trivial; simplemente que la funcionalidad que requiere el OP puede implementarse trivialmente, incluso si una solución generalmente óptima no lo es tanto. Las implementaciones de la biblioteca estándar deben estar altamente optimizadas porque su aplicación no se conoce de antemano. Al escribir código específico para una aplicación, solo necesita ser lo suficientemente rápido (o pequeño) para satisfacer las necesidades de la aplicación. En este caso específico, una implementación similar a su ejemplo puede ser injustificada. – Clifford

0

En la biblioteca estándar, no. Sin embargo, una búsqueda rápida en Google para "biblioteca de cadenas de seguridad c" arroja varios resultados potencialmente útiles. Sin saber más sobre la tarea que está tratando de realizar, no puedo recomendar ninguna implementación de terceros en particular.

Si esta es la única función "segura" que necesita más allá de las funciones estándar, entonces puede ser mejor ejecutar la suya en lugar de gastar el esfuerzo de integrar una biblioteca de terceros, siempre que esté seguro de que puede hazlo sin introducir errores adicionales.

+1

No veo la palabra "seguro" en la pregunta. –

+0

Tiene razón en que tomé una interpretación ligeramente diferente de la pregunta. Una lectura amplia de "puede incluir nulos" podría llevar a creer que también puede no incluir valores nulos. Como la falta de terminación nula es un problema importante que lleva a las personas a considerar 'strncpy()' (y, de hecho, 'strlcpy()'), pareció apropiado dirigir mi respuesta desde esa dirección, ya que otras respuestas ya habían cubierto otros enfoques . Intenté observar esto diciendo "Sin saber más sobre la tarea ... No puedo recomendar ninguna implementación de terceros en particular". Quizás podría haber sido más claro. – Adam

Cuestiones relacionadas