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()
.
En bref:
strcmp
compare les chaînes C terminées par nullstrncmp
compare au plus N caractères de chaînes C terminées par nullmemcmp
compare les tampons d'octets binaires de N octetsDonc, 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
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
.
strncmp et memcmp sont les mêmes sauf que le premier prend en charge la chaîne terminée par NULL.
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.