Chargement...

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érationDescriptionExemple
ConcaténationCombine deux chaînesa + b
LongueurRenvoie le nombre de caractèresa.length() ou a.size()
Accès aux caractèresAccès par indicea[0], a.at(2)
Sous-chaîneExtrait une partie de la chaînea.substr(2, 4)
ComparaisonComparaison alphabétiquea.compare(b)
Vide ?Vérifie si la chaîne est videa.empty()
EffacerSupprime le contenua.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() et to_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+.

Articles connexes