2010-01-02 13 views
10

Esiste una versione di strstr che funziona su una lunghezza fissa di memoria che può includere caratteri null?Una versione di byte pura di strstr?

Potrei esprimere la mia domanda in questo modo: strncpy è quello di memcpy come strstr è quello?

+1

Meglio è possibile scrivere un nuovo programma c per avere tale funzionalità. Non penso che sarebbe una cosa complessa. – Vijay

risposta

14

memmem, sfortunatamente è specifico per GNU anziché standard C. Tuttavia, è open-source in modo da poter copiare il codice (se la licenza è disponibile per voi).

7

Non nello standard library (che non è così grande, quindi date un'occhiata). Tuttavia scrivere il proprio è banale, direttamente byte per byte o usando memchr() seguito da memcmp() in modo iterativo.

+0

+1, mi piace l'idea di usare memchr e memcpy. Puoi prendere un'esecuzione strstr testuale e sostituire tutte le funzioni str con le loro controparti mem. – quinmars

+0

Le buone implementazioni di strstr non sono affatto banali - usano algoritmi sofisticati per lavorare molto, molto più velocemente di un algoritmo banale. Ad esempio, ecco il fulcro dell'implementazione in GNU libc: http://bazaar.launchpad.net/~vcs-imports/glibc/master/view/head:/string/str-two-way.h –

+0

@GregPrice: I sto dicendo che la libreria standard 'strstr()' è necessariamente banale; semplicemente che la funzionalità richiesta dall'OP può essere banalmente implementata, anche se una soluzione generalmente ottimale è inferiore. Le implementazioni della libreria standard devono essere ottimizzate in quanto la loro applicazione non è nota in anticipo. Quando si scrive codice specifico per un'applicazione, è sufficiente che sia veloce (o piccolo) per soddisfare le esigenze dell'applicazione. In questo caso specifico, un'implementazione simile al tuo esempio potrebbe essere ingiustificata. – Clifford

0

Nella libreria standard, n. Tuttavia, una rapida ricerca su google per "safe c string library" mostra diversi risultati potenzialmente utili. Senza saperne di più sull'attività che si sta tentando di eseguire, non posso raccomandare alcuna particolare implementazione di terze parti.

Se questa è l'unica funzione "sicura" che è necessaria oltre le funzioni standard, allora potrebbe essere meglio eseguire il rollover anziché utilizzare lo sforzo di integrare una libreria di terze parti, a condizione che si abbia la certezza che è possibile fallo senza introdurre ulteriori bug.

+1

Non vedo la parola "sicuro" nella domanda. –

+0

Hai ragione che ho interpretato in modo leggermente diverso la domanda. Una lettura ampia di "può includere valori nulli" potrebbe indurre a pensare che potrebbe anche non includere valori nulli. Poiché la mancanza di terminazione nulla è un problema importante che porta le persone a considerare 'strncpy()' (e, in effetti, 'strlcpy()'), mi è sembrato appropriato indirizzare la mia risposta da quella direzione, poiché altre risposte avevano già coperto altri approcci . Ho provato a notare questo affermando "Senza saperne di più sul compito ... Non posso raccomandare alcuna particolare implementazione di terze parti". Forse avrei potuto essere più chiaro. – Adam

Problemi correlati