¿Cómo comparar cadenas en C++?
Para comparar dos cadenas en C++ se puede hacer uso de dos funciones distintas, “strncmp” y “strcmp” las cuales se encuentran en la biblioteca <cstring> por lo que será necesario incluirla.
La diferencia entre estas funciones es que la función “strcmp” compara las cadenas hasta que un caracter sea diferente o hasta que se termine la cadena, y la función “strncmp” compara las cadenas hasta que un caracter sea diferente, o se termine la cadena, o hasta que llegue al numero de caracteres que se quería comparar (el cual se determina al hacer uso de ésta función), lo que pase primero.
La forma de hacer uso de estas funciones es la siguiente:
1 |
strnmp( nomdecadena1, nomdecadena2 ) |
siendo la primer cadena mencionada la que se usara como base para comparar la otra.
Al hacer uso de éstas funciones los valores que nos devuelve son números, los cuales pueden ser 0, 1 o -1.
- -1 : si el valor devuelto es igual a menos unos quiere decir que la cadena tiene un valor menor, o que va antes alfabéticamente con respecto a la cadena con la que se comparó.
- 0 : si el valor devuelto es cero quiere decir que las cadenas son iguales.
- 1 : si el valor devuelto es igual a menos unos quiere decir que la cadena tiene un valor mayor, o que va después alfabéticamente con respecto a la cadena con la que se comparó.
Ejemplo de comparación de cadenas con strcmp
Para entender esto mejor a continuación hay un ejemplo de un código para comparar dos cadenas, con la función “strcmp”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <cstring> //Importante agregar esta biblioteca para hacer uso de las funciones using namespace std; int main () { //Declaramos las cadenas char cadena1[] = "manzana"; char cadena2[] = "manzano"; //Mostramos el nombre de las cadenas al usuario cout << "La cadena uno se llama: " << cadena1; cout << "La cadena dos se llama: " << cadena2; //Comparando cadenas cout << "Comparando cadena 1 con respecto a cadena 2, es igual a: " << strcmp(cadena1, cadena2); cout << "Comparando cadena 2 con respecto a cadena 1, es igual a: " << strcmp(cadena2, cadena1); return 0; } |
y entonces el usuario al ejecutar este programa se vera así:
Vemos que cuando compara la cadena 1 con respecto a la 2 nos arroja el valor de -1, esto es por manzana (cadena1) va antes alfabéticamente que manzano (cadena2); y cuando compara la cadena 2 con respecto a la 1 nos da el valor de 1 porque manzano (cadena2) va después alfabéticamente que manzana (cadena1). Por el contrario si hubiéramos puesto que ambas cadenas se llaman manzana, al haber hecho la comparación hubiéramos obtenido el valor de 0, porque manzana es lo mismo que manzana.
Ejemplo de comparación de cadenas con strncmp
Ahora analicemos como funciona “strcnmp”. Como ya se mencionó anteriormente la diferencia de esta función con “strcmp” es que aquí vamos a decirle hasta que caracter quiero que haga la comparación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <cstring> //Importante agregar esta biblioteca para hacer uso de las funciones using namespace std; int main () { //Declaramos las cadenas char cadena1[] = "caza"; char cadena2[] = "casa"; //Mostramos el nombre de las cadenas al usuario cout << "La cadena uno se llama: " << cadena1; cout << "La cadena dos se llama: " << cadena2; //Comparando cadenas con la función strncmp cout << "Comparando cadena 1 con respecto a cadena 2, es igual a: " << strncmp(cadena1, cadena2, 2); //El numero que esta después de las cadenas a comparar indica hasta que caracter se van a comparar return 0; } |
Al ejecutar este programa veremos que nos arroja un 0, ya que ahí esta indicado que haga la comparación hasta el segundo caracter, y en la cadena 1 y 2 los primeros dos caracteres son iguales, es por eso que el valor es cero, porque hasta donde esta indicada la comparación las cadenas son iguales.
Convertir las cadenas a caracteres iguales
Como sabemos en el código acii los caracteres “a” y “A” son caracteres diferentes, por lo que si en un programa tenemos una cadena que se llama “DelFin” y otra que se llama “delfin” son cadenas distintas aunque nosotros mismo, ya que se van a tomar como caracteres diferentes. Por lo tanto si queremos comparar cadenas sin importar las mayúsculas ni las minúsculas debemos convertirlas a mayúsculas o a minúsculas.
Se puede elegir a que es lo que se quiere convertir si a mayúsculas o a minúsculas; si se quiere convertir a mayúsculas se utiliza la función “toupper” y si se quiere convertir a minisculas se utiliza la función “tolower”. Para hacer uso de estas funciones necesitamos la biblioteca <cctype>. Además junto con estas funciones usaremos un ‘for’ el cual le va a indicar que vaya convirtiendo cada caracter de la cadena a mayúsculas o a minúsculas (dependiendo de la función).
La manera de convertir las cadenas es la siguiente:
1 2 3 |
for ( i = 0; i < strlen(cadena); i++ ) { cadena[i] = toupper( cadena[i] ); } |
Ejemplo
A continuación un ejemplos de código para convertirlas a un mismo caracter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <iostream> #include <cctype> //Importante agregar esta biblioteca para usar las funciones using namespace std; int main () { //Declarando cadenas int i; char cadena1[] = "HOla"; char cadena2[] = "HolA"; //Mostrando cadenas a usuario cout << "cadena1 es: " << cadena1 << endl; cout << "cadena2 es: " << cadena2 << endl; //Convirtiendo cadenas for ( i = 0; i < strlen(cadena1) ; i++) { cadena1[i] = toupper(cadena1[i]); } for ( i = 0; i < strlen(cadena2) ; i++) { cadena2[i] = toupper(cadena2[i]); } // Aquí se usa la función toupper, pero si se quiere convertir a minúsculas solo se escribe tolower enves de toupper //Mostrando las nuevas cadenas cout << "Cadena1 ahora es: " << cadena1 << endl; cout << "Cadena2 ahora es: " << cadena2 << endl; return 0 } |
y entonces si ejecutamos el programa el usuario vera esto:
y si utilizamos la función “tolower” entonces vera esto:
Comparar cadenas sin importar mayúsculas ni minúsculas
Anteriormente en este documento ya se explicó cómo se comparan dos cadenas, y cómo se convierten las cadenas a mayúsculas o a minúsculas, este ultimo es importante ya que si queremos comparar dos cadenas sin importar mayúsculas ni minúsculas lo primero que se debe de hacer es convertir éstas a un solo tipo, porque sino se hace esto entonces al compararlas si dicen lo mismo pero una en mayúsculas y otra en minúsculas (o revuelto) marcara que las cadenas son diferentes; es por eso que primero tenemos que hacer esta conversión, para que así posteriormente se puedan comparar.
Un ejemplo de lo mencionado anteriormente es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <cstring> using namespace std; int main () { //Declarando cadenas char cadena1[] = "HOla"; char cadena2[] = "hoLA"; //Mostrando cadenas cout << "La cadena uno se llama: " << cadena1 << endl; cout << "La cadena dos se llama: " << cadena2 << endl; //Comparando cadenas cout << "Comparando la cadena 1 con respecto a la 2, es igual a: " << strcmp(cadena1, cadena2): cout << "Comparando la cadena 2 con respecto a la 1, es igual a: " << strcmp(cadena2, cadena1); return 0; } |
Si ejecutamos ese código veremos algo como esto:
En la comparación de la cadena 1 con respecto a la 2 nos arroja el valor de -1, lo que quiere decir que va antes, esto es porque en el código ascii la letra ‘H’ esta en el lugar 72 y la ‘h’ en lugar 104, por lo tanto primero va el “HOla” y después el “hoLA”.
Pero lo que se quiere aquí es que no nos importen las mayúsculas ni las minúsculas, sino solo compararlas sin tomar en cuenta eso, es decir, queremos que si por ejemplo comparamos las cadenas del ejemplo anterior obtengamos el valor de 0 (que nos diga que son iguales) porque en sí las dos dicen lo mismo pero escitas con caracteres diferentes.
Ejemplo
Entonces es por eso que utilizamos las funciones “tolower” o “toupper”; entonces ahora el código quedaría de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <iostream> #include <cstring> //Incluimos esta biblioteca para poder compararlas #include <cctype> //Incluimos esta biblioteca para poder convertir a mayúsculas y minúsculas using namespace std; int main () { //Declaramos cadenas int i; char cadena1[] = "HOla"; char cadena2[] = "HolA"; //Mostramos cadenas cout << "cadena1 es: " << cadena1 << endl; cout << "cadena2 es: " << cadena2 << endl; //Convertimos cadenas a mayúsculas for ( i = 0; i < strlen(cadena1) ; i++) { cadena1[i] = toupper(cadena1[i]); } for (char i = 0; i < strlen(cadena2) ; i++) { cadena2[i] = toupper(cadena2[i]); } //Comparamos cadenas cout << "Comparando la cadena 1 con respecto a la 2, es igual a: " << strcmp(cadena1, cadena2); cout << "Comparando la cadena 2 con respecto a la 1, es igual a: " << strcmp(cadena2, cadena1); return 0; } |
Y ahora los valores obtenidos serían estos:
Ahora si da 0 porque ya se convirtió a mayúsculas y ahora ya no encuentra caracteres diferentes.
Finalmente con este código ya obtenemos lo que queremos, comparar cadenas sin importas mayúsculas ni minúsculas.