comparar - ¿Cuál es la diferencia entre memcmp, strcmp y strncmp en C?
comparar strcmp (5)
strcmp ():
- Se usa para comparar las dos cadenas almacenadas en dos variables. Lleva cierto tiempo compararlas. Y entonces ralentiza el proceso.
strncmp ():
- Es muy similar al anterior, pero en este caso, compara el primer n número de caracteres solo. Esto también ralentiza el proceso.
memcmp ():
- Esta función se usa para comparar dos variables usando su memoria. No los compara uno por uno. Compara cuatro caracteres a la vez. Si su programa está demasiado preocupado por la velocidad, le recomiendo usar memcmp ().
Escribí este pequeño fragmento de código en C para probar las memcmp()
strncmp()
strcmp()
en C.
Aquí está el código que escribí:
#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");
}
¿Alguien puede explicarme las diferencias porque estoy confundido con estas tres funciones?
Mi problema principal es que tengo un archivo en el que tokenize su línea, el problema es que cuando tokenize la palabra "átomos" en el archivo, tengo que detener el proceso de tokenización.
Primero probé strcmp()
pero lamentablemente cuando llegó al punto donde la palabra "átomos" se colocó en el archivo no se detuvo y continuó, pero cuando usé el memcmp()
o el strncmp()
se detuvo y yo estaba feliz
Pero luego pensé, ¿qué pasa si hay un caso en el que hay una cadena en la que las primeras 5 letras son a, t, o, m, s y estas son seguidas por otras letras.
Lamentablemente, mis pensamientos eran correctos, ya que lo probé usando el código anterior al inicializar word1
a "atomsaaaaa" y word2
a átomos y memcmp()
y strncmp()
en las declaraciones if devueltas 0. Por otro lado, strcmp()
no lo hizo t. Parece que debo usar strcmp()
.
En breve:
-
strcmp
compara cadenas de C terminadas en nulo - strcmp compara como máximo N caracteres de cadenas C con terminación nula
-
memcmp
compara búferes de bytes binarios de N bytes
Entonces, si tienes estas cadenas:
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";
Entonces estos resultados son ciertos:
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
Para strcmp, querrás estar solo comparando lo que sabes que serán cadenas, sin embargo, a veces no es siempre así, como leer líneas de archivos binarios y para eso querrías usar memcmp para comparar ciertas líneas de entrada que contienen Los caracteres NUL pero coinciden y es posible que desee continuar verificando otras longitudes de entrada.
strncmp y memcmp son los mismos, excepto el hecho de que el anterior se encarga de la cadena terminada NULL.
memcmp
compara una cantidad de bytes. strcmp
y similares comparan cadenas .
En cierto modo, haces trampa en tu ejemplo porque sabes que ambas cadenas tienen 5 caracteres (más el terminador nulo). Sin embargo, ¿qué pasa si no conoce la longitud de las cadenas, que a menudo es el caso? Bueno, usas strcmp
porque sabe cómo manejar las cadenas , pero memcmp
no.
memcmp
se trata de comparar secuencias de bytes. Si sabe cuánto tiempo es cada cadena, sí, podría usar memcmp
para compararlas, pero ¿con qué frecuencia es así? Raramente. A menudo necesita funciones de comparación de cadenas porque, bueno, saben qué es una cadena y cómo compararlas.
En cuanto a cualquier otro problema que experimente, no está claro a partir de su pregunta y código. Sin embargo, strcmp
seguridad de que strcmp
está mejor equipado en el caso general para las comparaciones de cuerdas de lo que es el memcmp
.