Compter les occurrences d'un caractère dans String C++

Jinku Hu 12 octobre 2023
  1. Utilisez la méthode itérative pour compter les occurrences d’un caractère dans une chaîne
  2. Utilisez la fonction std::tolower pour compter les occurrences de caractères quelle que soit la casse des lettres
Compter les occurrences d'un caractère dans String C++

Cet article explique plusieurs méthodes pour compter les occurrences d’un caractère dans une chaîne C++.

Utilisez la méthode itérative pour compter les occurrences d’un caractère dans une chaîne

La bibliothèque de chaînes C++ fournit une classe std::string, qui peut être utilisée pour stocker et manipuler des séquences d’objets de type char. Il fournit plusieurs méthodes pour rechercher et trouver le caractère donné ou une sous-chaîne dans la chaîne, mais dans ce cas, nous devons vérifier chaque caractère afin qu’il soit plus simple d’implémenter une fonction qui itère dans la chaîne en incrémentant la variable count. Cette fonction prend un objet string comme référence et un char par valeur pour compter les occurrences. Attention cependant, cette version ne distingue pas les lettres majuscules des lettres inférieures, elle ne peut donc pas être utilisée lorsque le décompte doit inclure à la fois des caractères supérieurs et inférieurs.

#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);
}

Production:

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

Utilisez la fonction std::tolower pour compter les occurrences de caractères quelle que soit la casse des lettres

Une autre méthode pour implémenter l’exemple précédent est de réécrire la fonction countOccurrences pour comparer les valeurs converties des caractères à chaque itération. Notez que std::tolower est délicat à utiliser dans la mesure où il nécessite que le seul argument char soit représentable comme unsigned char; sinon, le comportement n’est pas défini. Ainsi, nous passons la valeur cast unsigned char à la fonction tolower puis la retournons au char pour la stocker dans une variable temporaire - tmp. De plus, nous appelons la fonction tolower à chaque itération pour convertir les caractères de chaîne en lettres minuscules pour l’instruction de comparaison. Notez que l’exemple de code suivant peut distinguer les caractères en majuscules et minuscules et les compter tous.

#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);
}

Production:

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

Article connexe - C++ Char