Contar apariciones de un carácter en una cadena C++

Jinku Hu 12 octubre 2023
  1. Utilice el método iterativo para contar las apariciones de un carácter en una cadena
  2. Utilice la función std::tolower para contar las apariciones de caracteres independientemente de las mayúsculas y minúsculas
Contar apariciones de un carácter en una cadena C++

Este artículo explicará varios métodos de cómo contar las apariciones de un carácter en una cadena C++.

Utilice el método iterativo para contar las apariciones de un carácter en una cadena

La biblioteca de cadenas de C++ proporciona una clase std::string, que se puede utilizar para almacenar y manipular secuencias de objetos similares a char. Proporciona múltiples métodos para buscar y encontrar el carácter dado o una subcadena en la cadena, pero en este caso, necesitamos verificar cada carácter para que sea más sencillo implementar una función que recorra la cadena mientras se incrementa la variable count. Esta función toma un objeto string como referencia y un char por valor para contar las ocurrencias. Sin embargo, tenga en cuenta que esta versión no distingue las letras mayúsculas de las inferiores, por lo que no se puede utilizar cuando el recuento debe incluir tanto caracteres superiores como inferiores.

#include <iostream>
#include <string>
#include <vector>

using std::cerr;
using std::cout;
using std::endl;
using std::string;

size_t countOccurrences(char c, string &str) {
  size_t count = 0;

  for (char i : str)
    if (i == c) count++;

  return count;
}

int main() {
  char ch1 = 'e';
  char ch2 = 'h';
  string str1("hello there, how are you doing?");
  string str2("Hello there! How are you doing?");

  cout << "number of char - '" << ch1
       << "' occurrences = " << countOccurrences(ch1, str1) << endl;
  cout << "number of char - '" << ch2
       << "' occurrences = " << countOccurrences(ch2, str2) << endl;

  exit(EXIT_SUCCESS);
}

Producción :

number of char - 'e' occurrences = 4
number of char - 'h' occurrences = 1

Utilice la función std::tolower para contar las apariciones de caracteres independientemente de las mayúsculas y minúsculas

Otro método para implementar el ejemplo anterior es reescribir la función countOccurrences para comparar los valores convertidos de los caracteres en cada iteración. Tenga en cuenta que std::tolower es complicado de usar ya que requiere que el único argumento char sea representable como unsigned char; de lo contrario, el comportamiento no está definido. Por lo tanto, pasamos el valor de conversión unsigned char a la función tolower y luego lo devolvemos al char para almacenarlo en una variable temporal - tmp. Además, llamamos a la función tolower en cada iteración para convertir los caracteres de cadena en letras minúsculas para la declaración de comparación. Tenga en cuenta que el siguiente ejemplo de código puede distinguir los caracteres en mayúsculas y minúsculas y contarlos todos.

#include <iostream>
#include <string>
#include <vector>

using std::cerr;
using std::cout;
using std::endl;
using std::string;

size_t countOccurrences(char c, string &str) {
  size_t count = 0;
  char tmp = static_cast<char>(tolower(static_cast<unsigned char>(c)));

  for (char i : str)
    if (tolower(static_cast<unsigned char>(i)) == tmp) count++;

  return count;
}

int main() {
  char ch1 = 'e';
  char ch2 = 'h';
  string str1("hello there, how are you doing?");
  string str2("Hello there! How are you doing?");

  cout << "number of char - '" << ch1
       << "' occurrences = " << countOccurrences(ch1, str1) << endl;
  cout << "number of char - '" << ch2
       << "' occurrences = " << countOccurrences(ch2, str2) << endl;

  exit(EXIT_SUCCESS);
}

Producción :

number of char - 'e' occurrences = 4
number of char - 'h' occurrences = 3
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++ Char