strstr() pour une chaîne qui n'est PAS null
Comment dois-je faire le en place équivalent de strstr()
pour un compté chaîne (c'est à dire pas null) dans C?
- Vous devrez écrire votre propre version.
- Quelle chaîne de caractères n'est pas nul? La chaîne de recherche en cours, ou de la sous-chaîne de caractères?
- Une recherche en cours (meule de foin).
- Ce n'est pas exactement banal... je pourrais essayer de KMP ou quelque chose si j'ai vraiment besoin de le faire, mais je préfère éviter si je peux.
- Vous pouvez voler de la mise en œuvre de
strnstr()
de BSD. Mais ce bug: mikeash.com/pyblog/dont-use-strnstr.html - Merci pour le lien, je vais jeter un oeil mais ce lien me rend un peu nerveux, haha.
- Avez-vous regardé Boyer-moore chaîne de recherche? Il fonctionne très bien sans résiliation de
\0
s et O(4*n). - J'avais entendu parler une fois, mais je sais peu de choses sur elle et je l'avais totalement oublié, je vais regarder ça, merci!
- Oui, Boyer-Moore est très bon. C'est un peu plus compliqué que KMP, donc si vous ne trouvez pas un ready-made de mise en œuvre, il peut ne pas être utile pour faire cuire vous-même. Si la performance est vraiment important, je voudrais cependant vous recommandons de BM, surtout si les aiguilles sont longues. (Dans le meilleur des cas, BM ne regarde que chaque
m
ème caractère.) - la glibc a memmem (l'aiguille et la botte de foin à la fois pris en compte), je suis sûr qu'il y aura un domaine public de la mise en œuvre là aussi.
Vous devez vous connecter pour publier un commentaire.
Si vous avez peur de O(m*n) comportement fondamentalement, vous n'avez pas besoin, de tels cas ne se produisent pas naturellement - voici une KMP mise en œuvre que j'avais couché autour de laquelle j'ai modifié pour tenir la longueur de la botte de foin. Aussi un wrapper. Si vous voulez faire des recherches répétées, écrire votre propre et la réutilisation de la
borders
tableau.Pas de garanties pour le bug de l'indice d'égouttage, mais il semble encore fonctionner.
Voir si la fonction ci-dessous qui fonctionne pour vous. Je n'ai pas testé à fond, donc je vous suggère de le faire.
strstr
est O(m + n). Donc, je suis à la recherche de quelque chose qui n'est pas ridiculement lent comme ma version. 🙂 Mais +1 de toute façon, depuis que l'idée fonctionne.strstr
est généralement défini comme un O(mn) de l'opération?? Merci pour cette remarque... alors, je vais probablement l'accepter dans un peu, puisque c'est exactement le substitut de la question.strstr()
.if (i + needle_length > length)
par simple réduction de lalength
de manière appropriée de sorte que lefor
condition de boucle est correcte.if (needle_length > length) return NULL;
, puislength -= needle_length;
, et lafor
boucle devientfor (i = 0; i <= length; i++)
(changement de<
à<=
pour vous assurer de vérifier la dernière position). La premièreif
vérification n'est nécessaire que parce que vous utilisezsize_t
; à l'aide dessize_t
permettrait d'éliminer la nécessité pour le contrôle. Bon compilateur peut être assez intelligent pour éliminerif
pour vous, mais pourquoi écrire un code complexe et espérons que si vous n'avez pas besoin d'.memcmp
pour éviterNUL
vérification destrncmp
. 2) à l'Aide dememchr
pour trouver le premier caractère de l'aiguille dans la botte de foin, de sorte que vous ne faites pas unstrncmp
/memcmp
appel de fonction pour chaque personnage (susceptibles de réduire le nombre d'appels par un facteur de 50x et 100x). Ou de sauter memchr et il suffit de tester le premier caractère manuellement avant d'appelerstrncmp
/memcmp
.Je viens de tomber sur ce sujet et je voudrais partager ma mise en œuvre. Il estime qu'il est assez rapide, je n'ai pas de "subcalls".
Il renvoie l'index dans la botte de foin où l'aiguille est trouvé ou -1 si il n'a pas été trouvé.
J'ai utilisé cette méthode