Cómo comparar dos cadenas ignorando el caso en C++

Jinku Hu 12 octubre 2023
  1. Usar la función strcasecmp para comparar dos cadenas ignorando el caso
  2. Usar la función strncasecmp para comparar dos cadenas ignorando el caso
  3. Usar la función personalizada toLower y el operador == para comparar dos cadenas ignorando el caso
Cómo comparar dos cadenas ignorando el caso en C++

Este artículo demostrará múltiples métodos sobre cómo comparar dos cadenas ignorando el caso de las letras en C++.

Usar la función strcasecmp para comparar dos cadenas ignorando el caso

strcasecmp es la función de la biblioteca estándar de C que puede ser incluida en el archivo fuente de C++ usando el encabezado <cstring>. La función en sí misma opera sobre una base de byte a byte y devuelve un número entero menor o igual o mayor que 0, según evalúen las cadenas correspondientes.

Es decir, si las dos cadenas ignoradas el caso son iguales, el valor de retorno es cero. En otros escenarios, cuando se encuentran los primeros caracteres diferentes, se comparan con los valores a su posición en el alfabeto, y se devuelve el resultado correspondiente.

#include <cstring>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string text1 = "Hey! Mr. Tambourine man, play a song for me";
  string text2 = "hey! Mr. Tambourine man, PLAY a song for me";
  string text3 = "Hey! Mrs. Tambourine man, play a song for me";

  if (strcasecmp(text1.c_str(), text2.c_str()) == 0) {
    cout << "strings: text1 and text2 match." << endl;
  } else {
    cout << "strings: text1 and text2 don't match!" << endl;
  }

  if (strcasecmp(text1.c_str(), text3.c_str()) == 0) {
    cout << "strings: text1 and text3 match." << endl;
  } else {
    cout << "strings: text1 and text3 don't match!" << endl;
  }

  return EXIT_SUCCESS;
}

Resultado:

strings: text1 and text2 match.
strings: text1 and text3 don't match!

Usar la función strncasecmp para comparar dos cadenas ignorando el caso

strncasecmp es otra variación de la función anterior que puede ser utilizada para comparar un número dado de caracteres de dos cadenas ignorando el caso. La función toma el valor entero para el número máximo de caracteres que deben ser comparados desde el primer char. El siguiente ejemplo demuestra cómo comparar los primeros 5 caracteres de dos cadenas ignorando el caso.

#include <cstring>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

constexpr int BYTES_TO_COMPARE = 5;

int main() {
  string text1 = "Hey! Mr. Tambourine man, play a song for me";
  string text3 = "hey! Mrs. Tambourine man, PLAY a song for me";

  if (strncasecmp(text1.c_str(), text3.c_str(), BYTES_TO_COMPARE) == 0) {
    printf("The first %d characters of strings: text1 and text3 match.\n",
           BYTES_TO_COMPARE);
  }

  return EXIT_SUCCESS;
}

Resultado:

The first 5 characters of strings: text1 and text3 match.

Usar la función personalizada toLower y el operador == para comparar dos cadenas ignorando el caso

Alternativamente, podemos convertir las cadenas al mismo caso y luego usar un simple operador == para la comparación. Como elección arbitraria, este ejemplo ofrece la bajada de ambas cadenas con una función definida por el usuario, que devuelve el objeto string. Finalmente, la sentencia if puede contener la expresión de comparación.

#include <cstring>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

std::string toLower(std::string s) {
  std::transform(s.begin(), s.end(), s.begin(),
                 [](unsigned char c) { return std::tolower(c); });
  return s;
}

int main() {
  string text1 = "Hey! Mr. Tambourine man, play a song for me";
  string text2 = "Hey! Mr. Tambourine man, play a song for me";
  string text3 = "Hey! Mrs. Tambourine man, play a song for me";

  if (toLower(text1) == toLower(text2)) {
    cout << "strings: text1 and text2 match." << endl;
  } else {
    cout << "strings: text1 and text2 don't match!" << endl;
  }

  if (toLower(text1) == toLower(text3)) {
    cout << "strings: text1 and text3 match." << endl;
  } else {
    cout << "strings: text1 and text3 don't match!" << endl;
  }

  return EXIT_SUCCESS;
}

Resultado:

strings: text1 and text2 match.
strings: text1 and text3 don't match!
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ String