String


To translate this course in your native langage:

  • In Chrome: right-click anywhere on the page and select “Translate to…”

  • Or use this language selector:

Les mots colorés en anglais représentent des mots-clés de la norme du langage C++. Ils sont conservés à l’identique lors de l’utilisation d’une traduction automatique avec Google Translate. Exemple : l’héritage (inheritance) est un principe fondamental de C++.


La classe std::string est une classe de la bibliothèque standard du C++ permettant de représenter et de manipuler des chaînes de caractères.

Deux manières de travailler

Avec les caractères internationaux

La classe std::string du C++ ne sait pas manipuler les caractères internationaux. Ainsi, seulement les opérations simples vont fonctionner correctement dans ce contexte :

  • Affichage

  • Lecture / Ecriture

  • Concaténation avec l’oéprateur +

  • Copie / Affectation

  • Egalité

En revanche, certaines opérations comme retourner la longeur d’une chaîne donneront des résultats incorrects. En effet, cette fonction retourne la longueur en octets de la chaîne et malheureusement les caractères internationaux/accentués sont codés sur plusieurs octets.

Avec les caractères ASCII

L’ASCII est une norme créée dans les années 1960 pour standardiser l’échange de texte entre ordinateurs. Ce standard code chaque caractère sur 1 octet mais n’utilise que 7 bits, soit 128 caractères principalement adaptés à l’anglais. Ceci explique pourquoi il ne couvre pas correctement les caractères accentués ou les alphabets internationaux. Voici une présentation synthétique de la table ASCII :

../_images/ascii.png

Avertissement

Si vous limitez vos chaînes aux caractères ASCII, l’ensemble des fonctions fournies par la classe string fonctionneront correctement.

Opérations de base

iostream

Cette librairie iostream propose un objet std::cout permettant l’affichage à l’écran en utilisant l’opérateur <<. La librairie <iostream> inclut aussi des constantes comme endl pour effectuer un retour à la ligne. Voici un exemple :

#include <iostream>
#include <string>

int main()
{
   std::string s = "Hello";
   std::cout << s << std::endl;
}

>> Hello

Note

Vous pouvez supprimer les std:: en écrivant using namespace std; en début de programme :

#include <iostream>
#include <string>
using namespace std;

int main()
{
   string s = "Hello";
   cout << s << endl;
}

Exemples

Voici quelques exemples pour découvrir les fonctions essentielles des string et l’utilisation de l’opérateur << :

#include <iostream>
#include <string>

using namespace std;

int main()
{
    // Creation / assignment
    string firstName = "John";
    string lastName  = "Smith";

    // Display
    cout << "First name: " << firstName << "  -  " << "Last name: " << lastName << endl;

    // Concatenation
    string fullName = firstName + " " + lastName;

    // Copy
    string copy = fullName;

    // Equality test
    if (copy == fullName)
        cout << "The two strings are identical." << endl;

    // Input
    string city;
    cout << "Enter your city: ";
    getline(cin, city);
    cout << "You live in " << city << endl;

    return 0;
}

Fonctions

Avertissement

Vous devez savoir à quoi sert chacune de ces fonctions. Il n’est pas demandé de les connaître par coeur mais juste de savoir ce qu’elles font.

Opérations sur les strings

Type

Exemple

Affichage

cout << s1 << endl;

Initialisation

string s1 = "Exemple 1";

Initialisation

string s2("Exemple 2");

Initialisation

string t {"Hello world"};

Conversion int->str

string s = to_string(42);

Conversion str->int

stoi(s);

Conversion str->double

stod(s);

Conversion str->float

stof(s);

Méthode

t.clear()

Efface tous les caractères

Méthode

t.erase(i٬nb)

Retire nb caractères à partir de l’index i

Méthode

t.insert(i٬"1-")

Insère une chaîne dans la chaîne t à la position i

Méthode

t.erase(index٬nb)

Retire nb caractères à la position i

Méthode

t.replace(index٬nb٬"test")

Remplace les nb`caractères à la position :cpp:`i

Méthode

t.append(s1)

Insère en fin

Méthode const

t.length()

Nombre de caractères

Méthode const

t.find("Ex")

Retourne l’index de la première occurrence

Méthode const

t.rfind("Ex")

Retourne l’index de la dernière occurrence

Méthode const

t.substr(i٬nb)

Retourne une sous-chaîne depuis l’index i

Opérateur +

s1+"@"+s2

Concaténation

Opérateur +=

s1+= "fin"

Insère en fin

Opérateur []

s1[i]

retour le i-ème caractère

Opérateur <

s1 < s2

Comparaison lexicographique

Opérateur ==

s1 == s2

Comparaison des caractères

Test

t.empty()

Indique si la chaîne est vide

Test

t.starts_with("Ex")

Teste le début de la chaîne de caractères

Test

t.ends_with("1")

Teste la fin de la chaîne de caractères

Les variables s1 et s2 représentent deux string initialisés avec "BOB" et "EVA". Pour chacune des expressions, donnez le résultat SANS guillemets :

Expression

Résultat

s1 + "_" + s2

to_string(50)

s1.append("O")

s2.find("VA")

s1[2]

s1 < s2

s2.ends_with("A")

Si vous cherchez la documentation de la classe string, il faudra consulter celle de la classe basic_string.

Points techniques

Formatage des flottants

La librairie <iomanip> fournit des fonctions permettant de contrôler l’affichage des nombres flottants :

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
        // indicates the number of digits after the decimal point.
        cout << setprecision(5) << 3.141519 << endl;   // ==>> 3.1415  5 digits
        cout << setprecision(3) << 3.141519 << endl;   // ==>> 3.14    3 digits

        // Padding Output
        cout << setfill('-');
        cout << setw(5) << 25 << endl;   // ---25
        cout << setw(5) << 148;          // --148
}

Afficher vos objets

Il est possible de surcharger l’opérateur << pour que cout puisse afficher de nouvelles classes :

#include <iostream>
using namespace std;

struct Point
{
    int x, y;
    Point(int xx, int yy) { x = xx; y = yy; }
};


ostream & operator << (ostream & stream, const Point & p)
{
    stream << "(" << p.x << "," << p.y << ")";
    return stream;
}

int main()
{
   Point p(4,5);
   cout << p;
}

>> (4,5)

Entrées/Sorties

Stream

La notion de stream en C++ correspond à un flux de données où l’on peut lire ou écrire. Il peut s’agir, par exemple, de la console, d’un fichier ou encore d’une chaîne de caractères servant d’input ou d’output buffer. La bibliothèque standard du C++ a homogénéiser la syntaxe permettant de gérer ces différents flux, ce qui permet par exempel d’utiliser le même opérateur << pour tous les streams de sortie.

Output stream

Dans cette catégorie, on trouve :

  • cout : objet global associé au flux standard de sortie (l’écran)

  • ostringstream : classe permettant d’écrire dans une chaîne de caractères

  • ofstream : classe permettant d’écrire dans un fichier

#include <iostream>
#include <sstream>    // string stream
#include <fstream>    // file stream

using namescape std;

int main()
{
        // output to console
        cout << "Hello !"

        // output to a string buffer
        ostringstream os;
        os << "Hello !" << endl;
        os << "How are you?";
        cout << os.str();

        // output to a file
        ofstream ofs("C:\\test\\output.txt");
        ofs << "Hello !" << endl;
        ofs.close();

        return 0;
}

Input stream

La logique est identique pour les inputs streams :

  • cin : objet global associé au flux standard d’entrée (le clavier)

  • ifstream spécialisée dans la lecture des fichiers (input file stream)

  • istringstream spécialisée dans la lecture des chaînes de caractères (input string stream)

#include <iostream>
#include <sstream>     // string stream
#include <fstream>     // file stream

using namespace std;

int main()
{
    int a, b, c;

    // Input from keyboard
    cin >> a >> b >> c;
    cout << a << " " << b << " " << c << endl;

    // Input from a string
    istringstream iss("11 12 13");
    iss >> a >> b >> c;
    cout << a << " " << b << " " << c << endl;

    // Input from a file
    ifstream ifs("C:\\test\\output.txt");
    ifs >> a >> b >> c;
    cout << a << " " << b << " " << c << endl;

    ifs.close();

    return 0;
}

Note

Depuis un fichier, ou depuis une string, le caractère espace est utilisé comme séparateur entre les différentes informations.

Dans les fonctions utiles, on peut citer :

  • getline(streamin,str) : lit une ligne et la charge dans l’objet string str

  • getline(streamin,str, "#") : idem mais en utilisant le caractère # comme séparateur