web-dev-qa-db-fra.com

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

J'ai écrit ce petit morceau de code en C pour tester les fonctions memcmp()strncmp()strcmp() 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 problème principal est que j'ai un fichier dans lequel j'en tokenise la ligne, le problème est que lorsque je tokenise le mot "atomes" dans le fichier, je dois arrêter le processus de tokenisation.

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

Mais alors j'ai pensé, et s'il y aura 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 lorsque je l'ai testé en utilisant le code ci-dessus en initialisant Word1 En "atomesaaaaa" et Word2 En atomes et memcmp() et strncmp() dans les instructions if a retourné 0. En revanche strcmp() ce n'est pas le cas. Il semble que je doive utiliser strcmp().

36
und3rd06012

En bref:

  • strcmp compare les chaînes C terminées par null
  • strncmp compare au plus N caractères de chaînes C terminées par null
  • memcmp compare les tampons d'octets binaires de N octets

Donc, si vous avez ces chaînes:

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

Alors 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
94
Adam Rosenfield

memcmp compare un certain nombre d'octets. strcmp et similaires comparer chaînes.

Vous trichez dans votre exemple parce que vous savez que les deux chaînes ont 5 caractères (plus le terminateur nul). Cependant, que faire si vous ne connaissez pas la longueur des cordes, ce qui est souvent le cas? Eh bien, vous utilisez strcmp parce que il sait comment gérer les chaînes, memcmp ne fonctionne pas.

memcmp consiste à comparer des séquences d'octets. Si vous savez combien de temps chaque chaîne est alors oui, vous pouvez utiliser memcmp pour les comparer, mais à quelle fréquence est-ce le cas? Rarement. Vous avez souvent besoin de fonctions de comparaison de chaînes car, eh bien ... elles savent ce qu'est une chaîne et comment les comparer.

Quant à tout autre problème que vous rencontrez, il n'apparaît pas clairement dans votre question et votre code. Soyez assuré cependant que strcmp est mieux équipé dans le cas général pour les comparaisons de chaînes que memcmp.

7
Ed S.

strcmp ():

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

strncmp ():

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

memcmp ():

  • Cette fonction permet de comparer deux variables en utilisant leur mémoire. Il ne les compare pas un par un, Il compare quatre caractères à la fois. Si votre programme est trop préoccupé par la vitesse, je vous recommande d'utiliser memcmp ().
4
Arvind kr

strncmp et memcmp sont les mêmes sauf que le premier prend en charge la chaîne terminée par NULL.

1
prashant

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

1
RAZ_MUH_TAZ