existe une version de Strstr qui fonctionne sur une longueur de mémoire fixe pouvant inclure des caractères nuls? P>
Je pourrais formuler ma question comme ceci: Strncpy est à Memcpy comme Strstr est à? p>
3 Réponses :
MEMMEM , malheureusement, il est spécifique GNU plutôt que Standard C. Toutefois, il est ouvert -Source afin que vous puissiez copier le code (si la licence est saturée pour vous). P>
pas dans le bibliothèque standard (ce qui n'est pas si grand, alors prenez donc un voir). Cependant, écrire votre propre est trivial, soit directement octet par octet ou à l'aide de Mémchr () suivi de MEMCMP () itérativement. P>
+1, j'aime l'idée d'utiliser Memchr et Memcpy. Vous pouvez prendre une implémentation Strstr Verbatim et remplacer toutes les fonctions STR avec leurs homologues MEM.
Les bonnes implémentations de Strstr ne sont pas du tout trivial - elles utilisent beaucoup d'algorithmes sophistiqués pour travailler beaucoup, beaucoup plus rapidement qu'un algorithme trivial. Par exemple, voici le noyau de la mise en œuvre dans GNU LIBC: bazaar.launchpad.net/~vcs-imports/glibc/master/view/head:/...
@Gregprice: je suis sot suggérant que la bibliothèque standard strtstr () code> est nécessairement triviale; Simplement que la fonctionnalité requise par l'OP peut être trivialement implémentée, même si une solution généralement optimale est de moins en moins. Les implémentations de bibliothèque standard doivent être très optimisées car leur application n'est pas connue à l'avance. Lors de l'écriture de code spécifique à une application, il suffit de ne pas être assez rapide (ou de petite taille) pour répondre aux besoins de l'application. Dans ce cas particulier, une implémentation similaire à votre exemple peut être injustifiée.
Dans la bibliothèque standard, non. Cependant, une recherche rapide de Google de "Bibliothèque de chaînes Safe C" présente plusieurs résultats potentiellement utiles. Sans en savoir plus sur la tâche que vous essayez d'effectuer, je ne peux recommander aucune mise en œuvre d'une tierce partie particulière. P>
S'il s'agit de la seule fonction "sûre" dont vous avez besoin au-delà des fonctions standard, il peut être préférable de faire valoir votre propre plutôt que de dépenser l'effort d'intégration d'une bibliothèque tierce, à condition que vous soyez sûr que vous pouvez faire donc sans introduire des bugs supplémentaires. P>
Je ne vois pas le mot "sûr" dans la question.
Vous avez raison que j'ai pris une interprétation légèrement différente de la question. Une large lecture de "peut inclure des NULLS" pourrait conduire à croire que cela peut également inclure des nuls. Comme l'absence de résiliation nulle est un problème majeur qui dirige les personnes à considérer strncpy () code> (et, en effet,
strlcpy () code>), il semblait approprié de répondre à ma réponse de cette réponse. Direction, car d'autres réponses avaient déjà couvert d'autres approches. J'ai tenté de noter cela en indiquant "sans en savoir plus sur la tâche ... Je ne peux recommander aucune mise en œuvre d'une tierce partie particulière." Peut-être que j'aurais pu être plus clair.
Mieux vaut écrire un nouveau programme C pour avoir une telle fonctionnalité. Je ne pense pas que ce serait une chose complexe.