2. C++ Avancé
2.5. la classe string
La classe string est un container de la STL implantée sous forme
d'un vector<char>. Elle offre de nombreuses
fonctionnalités qui permettent de simplifier la gestion des chaînes de
caratères.
2.5.1. Déclaration
#include <string>
#include <iostream>
using namespace std;
// must declare C string as const char*
const char *c_string = "voici une chaine";
int main() {
string s1(c_string);
cout << s1 << endl;
string s2;
s2 = "voila une autre chaine";
cout << s2 << endl;
string s3("finalement une autre chaine");
cout << s3 << endl;
string s4(s3);
cout << s4 << endl;
string s5(40, '*');
cout << s5 << endl;
return 0;
}
voici une chaine
voila une autre chaine
finalement une autre chaine
finalement une autre chaine
****************************************
2.5.2. Longueur, concaténation, insertion, suppression, manipulation
- pour accéder à une caratère on utilise l'opérateur []
- pour obtenir la longueur d'une chaine en nombre de caractères on utilise la méthode
size()
- la méthode insert(...) permet d'insérer une sous-chaine dans une chaine
- la méthode erase(...) permet quant à elle de supprimer une sous-chaine
- pour extraire une sous-chaine on utilise substr(...)
- pour concaténer des chaines on utiliser l'opérateur +
#include <string>
#include <iostream>
using namespace std;
int main() {
string s1("voici une chaine");
// print length
cout << "length of s1 = " << s1.size() << endl;
// modify characters
s1[3] = 'l';
s1[4] = 'a';
cout << "s1 = " << s1 << endl;
// append string
string s2(" de caracteres");
s1 += s2;
cout << "s1 = " << s1 << endl;
// insert string at position 10
string s3("autre ");
s1.insert(10, s3);
cout << "s1 = " << s1 << endl;
// remove 6 characters at position 10
s1.erase(10, 6);
cout << "s1 = " << s1 << endl;
// extract substring
string s4 = s1.substr(10);
cout << "s4 = " << s4 << endl;
// extract substring
string s5 = s1.substr(6, 3);
cout << "s5 = " << s5 << endl;
// replace 'voila' by 'voici' takes the 5 first characters
s1.replace(0, 5, "voici des");
cout << "s1 = " << s1 << endl;
string x("il etait");
string y("une fois");
string z(" ");
string t = x + z + y;
cout << "t = " << t << endl;
return 0;
}
length of s1 = 16
s1 = voila une chaine
s1 = voila une chaine de caracteres
s1 = voila une autre chaine de caracteres
s1 = voila une chaine de caracteres
s4 = chaine de caracteres
s5 = une
s1 = voici des une chaine de caracteres
t = il etait une fois
2.5.3. Trouver une sous chaine ou des caractères
- pour trouver une sous-chaine on utilise la méthode find(...)
- pour trouver un caractère parmi un ensemble de caractères stockés dans une chaine, on utilise
l'une des méthodes : find_first_of(...),
find_first_not_of(...),
find_last_of(...),
find_last_not_of(...)
- la valeur string::npos (no position) est une valeur entière qui
est retournée quand une chaine ou un caractère n'a pas été trouvé.
#include <string>
#include <iostream>
using namespace std;
int main() {
string s1("coucou, dit le coucou au long cou.");
cout << s1 << endl;
string le("le");
string::size_type pos = s1.find(le);
cout << "string " << le << " found at position " << pos << endl;
// -----------------------------
// find all occurrences of 'cou'
// -----------------------------
string cou("cou");
pos = 0;
pos = s1.find(cou, pos);
while (pos != string::npos) {
cout << "string " << cou << " found at position " << pos << endl;
++pos;
pos = s1.find(cou, pos);
}
// --------------------------------
// replace all occurrences of 'cou'
// --------------------------------
string match("cou");
string replace("do");
pos = 0;
pos = s1.find(match, pos);
while (pos != string::npos) {
s1.replace(pos, match.size(), replace);
++pos;
pos = s1.find(match, pos);
}
cout << "s1 = " << s1 << endl;
// -----------------------------------------------
// find first occurrence of one character in a set
// -----------------------------------------------
pos = s1.find_first_of(",.");
cout << "found " << s1[pos] << " at position " << pos << endl;
return 0;
}
2.5.3.a Exemple : trim
On désire réaliser l'opération trim qui permet d'éliminer les espaces,
tabulations, retours chariots en début et fin de chaine.
#include <string>
#include <iostream>
using namespace std;
// ----------------------------------------------
// trim on left side of string
// ----------------------------------------------
void trim_left(string& s) {
string::size_type pos = s.find_first_not_of(" \t\n");
if (pos != 0) {
s.erase(0, pos);
}
}
// ----------------------------------------------
// trim on right side of string
// ----------------------------------------------
void trim_right(string& s) {
string::size_type pos = s.find_last_not_of(" \t\n");
if (pos != s.size()) {
s.erase(pos+1);
}
}
// ----------------------------------------------
// trim on left and right side of string
// ----------------------------------------------
void trim(string& s) {
trim_left(s);
trim_right(s);
}
// ----------------------------------------------
// main function
// ----------------------------------------------
int main() {
string s = " \t\nvoici une chaine \t\t\t\n\n ";
cout << "s before trim = [" << s << "]" << endl;
trim(s);
cout << "s after trim = [" << s << "]" << endl;
return 0;
}
s before trim = [
voici une chaine
]
s after trim = [voici une chaine]