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 :
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.
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