2012-02-03 14 views
5

Así que tengo un dilema. Necesito comparar dos cadenas estilo C y busqué las funciones que sería el más apropiado:¿Cuál es la función adecuada para comparar dos cadenas de estilo C?

memcmp //Compare two blocks of memory (function) 
strcmp //Compare two strings (function) 
strcoll //Compare two strings using locale (function) 
strncmp //Compare characters of two strings (function) 
strxfrm //Transform string using locale (function) 

El primero creo que es para las direcciones, por lo que la idea es salir. El segundo me parece la mejor opción, pero quiero escuchar comentarios de todos modos. Los otros tres me dejan despistado.

+0

* "El primero creo que es para direcciones" * - No, es para bloques de memoria arbitrarios. Al final, todas esas funciones toman direcciones que apuntan a los bloques de memoria que se compararán. Pero ninguno en realidad compara direcciones. Pero a partir de los comentarios dentro del código, creo que está enterado de esto y simplemente se expresó de manera un poco inexacta. –

Respuesta

19

Para las comparaciones generales de cadenas, strcmp es la función adecuada. Debe usar strncmp para comparar solo un número de caracteres de una cadena (por ejemplo, un prefijo) y memcmp para comparar bloques de memoria.

Dicho esto, ya que está usando C++, debe evitar esto por completo y utilizar la clase std::string, que es mucho más fácil de usar y generalmente más segura que las cadenas de estilo C. Puede comparar dos std::string s para igualdad con solo usar el operador ==.

Espero que esto ayude!

+0

Gracias, me encantaría, pero por ahora nuestro profesor nos está restringiendo a usar C Strings. – Yokhen

+0

Busca el código de la función C plus y léelo ... quizás encuentres una sorpresa., Y @templatetypedef, creo que == no es el operador de rito en este caso, imho. – crsuarezf

+0

@ ingcarlos- Tiene razón en que no debe usar == aquí. Mi sugerencia es cambiar a std :: string de C++, en cuyo caso el operador == es el camino a seguir. – templatetypedef

3

Ambos memcmp y strcmp funcionarán bien. Para usar el primero, necesitará saber la longitud de la secuencia más corta por adelantado.

+2

Si llama a 'memcmp' con la longitud de la cadena anterior, le dirá que' "abc" 'y' "abcdef" 'son iguales. Podrías pasarlo a lo largo de la cadena más corta más uno (y verá y comparará el terminador ''\ 0''), pero como' strcmp' está específicamente diseñado para comparar cadenas, eso es lo que deberías usar. –

+0

Estoy de acuerdo con todo eso, sí. –

+0

¿Alguien sabe si 'memcmp' puede ser más rápido, digamos debido a que conoce la longitud de antemano y, por lo tanto, permite cierta optimización al observar trozos de longitud de palabra en primera instancia? – Keith

Cuestiones relacionadas