Quelle est la différence entre memcmp, strcmp et strncmp en C?

j'ai écrit ce petit morceau de code en C pour tester memcmp()strncmp() strcmp() fonctions en C.

Voici le code que j'ai écrit:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
        char *word1="apple",*word2="atoms";

        if (strncmp(word1,word2,5)==0)
                printf("strncmp result.n");
        if (memcmp(word1,word2,5)==0)
                printf("memcmp result.n");
        if (strcmp(word1,word2)==0)
                printf("strcmp result.n");
}

quelqu'un Peut-il m'expliquer les différences, parce que je suis confus avec ces trois fonctions?

Mon principal problème est que j'ai un fichier dans lequel j'ai marquer sa ligne,le problème est que quand j'ai marquer le mot "atome" dans le fichier que j'ai arrêter le processus de segmentation.

j'ai d'abord essayé strcmp() mais malheureusement, quand il a atteint le point où le mot "atome" ont été placés dans le fichier, il n'arrête pas et il a continué,mais quand j'ai utilisé memcmp() ou strncmp() ça s'est arrêté et j'étais heureux.

mais alors j'ai pensé,et s'il y avait un cas dans lequel il y a une chaîne dans laquelle les 5 premières lettres sont a,t,o,m,s et celles-ci sont suivies par d'autres lettres.

malheureusement, mes pensées étaient bonnes comme je l'ai testé en utilisant le code ci-dessus par l'initialisation word1 "atomsaaaaa" et word2 aux atomes et memcmp() et strncmp() dans les déclarations si retournées 0.Sur l'autre main strcmp() il n'a pas. Il semble que je dois utiliser strcmp().

33

5 réponses

En bref:

  • strcmp compare null chaînes C
  • strncmp compare au plus N caractères terminée par null chaînes C
  • memcmp compare binaire octet tampons de N octets

Donc, si vous avez ces chaînes:

const char s1[] = "atoms";  // extra null bytes at end
const char s2[] = "atomsabc";     // embedded null byte
const char s3[] = "atomsaaa";

Ensuite, ces résultats restent vrais:

strcmp(s1, s2) == 0      // strcmp stops at null terminator
strcmp(s1, s3) != 0      // Strings are different
strncmp(s1, s3, 5) == 0  // First 5 characters of strings are the same
memcmp(s1, s3, 5) == 0   // First 5 bytes are the same
strncmp(s1, s2, 8) == 0  // Strings are the same up through the null terminator
memcmp(s1, s2, 8) != 0   // First 8 bytes are different
85
répondu Adam Rosenfield 2012-10-26 23:06:10

memcmp compare un nombre d'octets. strcmp et comme comparer chaînes de caractères.

vous trichez dans votre exemple parce que vous savez que les deux chaînes sont longues de 5 caractères (plus le terminator nul). Cependant, si vous ne connaissez pas la longueur des chaînes, ce qui est souvent le cas? Eh bien, vous utilisez strcmp parce que il sait traiter les chaînes de caractères,memcmp ne fonctionne pas.

memcmp est tout au sujet de comparer des séquences d'octets. Si vous savez combien de temps chaque chaîne est alors ouais, vous pouvez utiliser memcmp pour les comparer, mais combien de fois est-ce le cas? Rarement. Vous avez souvent besoin de fonctions de comparaison de chaîne de caractères parce que, bien... ils savent qu'une chaîne est et comment les comparer.

comme pour tout autre problème que vous rencontrez, il n'est pas clair d'après votre question et votre code. Rassurez-vous cependant que strcmp est mieux équipé dans le cas général pour les comparaisons de chaînes de memcmp est.

7
répondu Ed S. 2012-10-26 23:03:27

strcmp ():

  • Il est utilisé pour comparer les deux chaîne stockée dans deux variables, Il faut un certain temps pour les comparer. Et donc, il ralentit le processus.

strncmp ():

  • il est très similaire au précédent, mais dans celui-ci, il compare le premier n nombre de caractères seulement. Cela ralentit le processus.

memcmp ():

  • cette fonction est utilisée comparer deux variables en utilisant leur mémoire. Il ne se compare pas un par un, Il compare quatre caractères à la fois. Si votre programme est trop préoccupé par la vitesse, je recommande d'utiliser memcmp().
4
répondu Arvind kr 2014-09-07 10:55:08

strncmp et memcmp sont les mêmes sauf que l'ancien s'occupe de la chaîne nulle.

1
répondu prashant 2013-12-10 09:40:01

pour strcmp, vous voudrez ne Comparer que ce que vous savez être des chaînes de caractères, mais parfois ce n'est pas toujours le cas comme la lecture de lignes de fichiers binaires et là pour vous voulez utiliser memcmp pour comparer certaines lignes d'entrée qui contiennent des caractères NUL mais concordent et vous voudrez peut-être continuer à vérifier d'autres longueurs d'entrée.

1
répondu RAZ_MUH_TAZ 2014-02-15 23:08:37