Manipulation de chaînes en C++ : C-Style et std::string
Apprenez la manipulation de chaînes en C++ avec les chaînes C-Style et std::string à travers des exemples pratiques.
En C++, les opérations sur les chaînes de caractères peuvent être effectuées à la fois avec les tableaux de caractères de style C (char arrays)
et avec la classe moderne std::string.
Les chaînes de style C offrent un contrôle bas niveau, tandis que la classe std::string est plus sûre et plus pratique.
Cet article explore en détail toutes les manières de manipuler du texte en C++.
1. Chaînes de style C (tableaux de char)
Les chaînes de style C sont des tableaux de char terminés par un caractère nul ('\0').
Elles sont stockées en mémoire comme une séquence continue de caractères.
#include <iostream>
using namespace std;
int main() {
char message1[] = "Bonjour"; // '\0' est ajouté automatiquement
char message2[20] = "C++"; // 19 caractères maximum + '\0'
cout << message1 << " " << message2 << endl;
return 0;
}
Lorsqu’on travaille avec des chaînes de style C, il est essentiel de ne pas dépasser les limites du tableau. C++ ne vérifie pas automatiquement les dépassements de limites pour ces tableaux.
2. strcpy, strcat, strlen, strcmp (Fonctions de chaînes C)
Lorsqu’on utilise des chaînes de style C, on emploie souvent les fonctions de la bibliothèque <cstring> :
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a[20] = "C++";
char b[20] = "Programmation";
// Concaténation
strcat(a, " "); // a = "C++ "
strcat(a, b); // a = "C++ Programmation"
// Copie
char c[20];
strcpy(c, a);
// Longueur
cout << "Longueur : " << strlen(a) << endl;
// Comparaison
if (strcmp(a, c) == 0)
cout << "A et C sont égaux." << endl;
cout << "Résultat : " << a << endl;
}
Ces fonctions doivent être utilisées avec précaution, car elles présentent un risque de débordement de tampon.
En C++ moderne, il est recommandé d’utiliser std::string à la place.
3. Introduction à la classe std::string
En C++ moderne, la bibliothèque <string> est utilisée pour la manipulation de texte.
Les objets std::string peuvent grandir dynamiquement, gèrent automatiquement la mémoire
et offrent de nombreuses fonctions pratiques.
#include <iostream>
#include <string>
using namespace std;
int main() {
string prenom = "Ali";
string nom = "Yilmaz";
string nomComplet = prenom + " " + nom;
cout << "Bonjour " << nomComplet << endl;
return 0;
}
Le type std::string peut être facilement concaténé avec l’opérateur +
et comparé directement avec ==.
4. Opérations de base sur les chaînes
| Opération | Description | Exemple |
|---|---|---|
| Concaténation | Combine deux chaînes | a + b |
| Longueur | Renvoie le nombre de caractères | a.length() ou a.size() |
| Accès aux caractères | Accès par indice | a[0], a.at(2) |
| Sous-chaîne | Extrait une partie de la chaîne | a.substr(2, 4) |
| Comparaison | Comparaison alphabétique | a.compare(b) |
| Vide ? | Vérifie si la chaîne est vide | a.empty() |
| Effacer | Supprime le contenu | a.clear() |
string texte = "Programmation";
cout << texte.length() << endl; // 13
cout << texte.substr(0, 7) << endl; // "Program"
5. Recherche, remplacement et suppression
std::string propose de nombreuses fonctions puissantes pour la manipulation de texte :
string message = "Langage de programmation C++";
// Recherche
size_t position = message.find("programmation");
if (position != string::npos)
cout << "'programmation' trouvé à l’index : " << position << endl;
// Remplacement
message.replace(4, 11, "moderne"); // remplace 11 caractères à partir de l’index 4
cout << message << endl; // "Langage moderne C++"
// Suppression
message.erase(4, 7); // supprime 7 caractères à partir de l’index 4
cout << message << endl; // "Langage C++"
La méthode find() renvoie string::npos si le texte recherché n’est pas trouvé.
Cette valeur signifie « non trouvé ».
6. Opérations au niveau des caractères
Puisqu’une chaîne est composée de caractères, elle peut être traitée caractère par caractère à l’aide de boucles.
#include <iostream>
#include <string>
using namespace std;
int main() {
string mot = "Cplusplus";
for (char c : mot) {
cout << c << " ";
}
cout << endl;
// Conversion en majuscules
for (char &c : mot) {
c = toupper(c);
}
cout << mot << endl;
}
Pour les conversions de caractères, on peut utiliser les fonctions toupper() et tolower()
de la bibliothèque <cctype>.
7. Opérations de conversion (string <→ int, double)
Une std::string peut être convertie en valeurs numériques et inversement.
#include <iostream>
#include <string>
using namespace std;
int main() {
string texteNombre = "42";
int nombre = stoi(texteNombre); // string → int
double d = stod("3.14"); // string → double
cout << nombre + 10 << endl; // 52
cout << d * 2 << endl; // 6.28
// int → string
int age = 25;
string texte = to_string(age);
cout << "Âge : " << texte << endl;
}
8. Comparaison (compare, ==, <, >)
Les chaînes peuvent être comparées à l’aide de la méthode compare() ou des opérateurs de comparaison.
string a = "Ali";
string b = "Veli";
if (a == b)
cout << "Égales" << endl;
else if (a < b)
cout << "A vient avant alphabétiquement" << endl;
else
cout << "A vient après alphabétiquement" << endl;
9. Opérations d'entrée et de sortie
L’objet cin lit uniquement jusqu’au premier espace.
Si vous souhaitez lire une phrase complète, utilisez la fonction getline().
#include <iostream>
#include <string>
using namespace std;
int main() {
string nom;
cout << "Entrez votre nom : ";
cin >> nom;
cout << "Bonjour, " << nom << endl;
cin.ignore(); // Efface le caractère de saut de ligne restant dans le tampon
string phrase;
cout << "Entrez une phrase : ";
getline(cin, phrase);
cout << "Vous avez saisi : " << phrase << endl;
}
getline() lit la ligne entière, y compris les espaces.
10. Exemple : Analyse de texte
L’exemple suivant compte le nombre de caractères et de mots dans une phrase saisie par l’utilisateur.
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
string texte;
cout << "Entrez une phrase : ";
getline(cin, texte);
int nbCaracteres = 0;
int nbMots = 1;
for (char c : texte) {
if (isalpha(c))
nbCaracteres++;
if (c == ' ')
nbMots++;
}
cout << "Nombre de caractères : " << nbCaracteres << endl;
cout << "Nombre de mots : " << nbMots << endl;
return 0;
}
11. TL;DR
- Les chaînes de style C sont des tableaux
char[]et doivent être utilisées avec précaution. - En C++ moderne, il est recommandé d’utiliser la classe
std::string. - Opérations de base :
+,length(),substr(),find(),replace(),erase(). - Pour les conversions numériques, utilisez
stoi(),stod()etto_string(). getline()permet de lire du texte contenant des espaces.- Tous les exemples peuvent être exécutés dans Visual Studio 2022 ou GCC 11+.