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

  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. // must declare C string as const char*
  6. const char *c_string = "voici une chaine";
  7.  
  8. int main() {
  9.     string s1(c_string);
  10.     cout << s1 << endl;
  11.  
  12.     string s2;
  13.     s2 = "voila une autre chaine";
  14.     cout << s2 << endl;
  15.    
  16.     string s3("finalement une autre chaine");
  17.     cout << s3 << endl;
  18.    
  19.     string s4(s3);
  20.     cout << s4 << endl;
  21.    
  22.     string s5(40, '*');
  23.     cout << s5 << endl;
  24.  
  25.     return 0;  
  26. }
  27.  
voici une chaine
voila une autre chaine
finalement une autre chaine
finalement une autre chaine
****************************************

2.5.2. Longueur, concaténation, insertion, suppression, manipulation

  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main() {
  6.     string s1("voici une chaine");
  7.    
  8.     // print length
  9.     cout << "length of s1 = " << s1.size() << endl;
  10.    
  11.     // modify characters
  12.     s1[3] = 'l';
  13.     s1[4] = 'a';
  14.     cout << "s1 = " << s1 << endl;
  15.    
  16.     // append string
  17.     string s2(" de caracteres");
  18.     s1 += s2;
  19.     cout << "s1 = " << s1 << endl;
  20.    
  21.     // insert string at position 10
  22.     string s3("autre ");
  23.     s1.insert(10, s3);
  24.     cout << "s1 = " << s1 << endl;
  25.    
  26.     // remove 6 characters at position 10
  27.     s1.erase(10, 6);
  28.     cout << "s1 = " << s1 << endl;
  29.    
  30.     // extract substring
  31.     string s4 = s1.substr(10);
  32.     cout << "s4 = " << s4 << endl;
  33.    
  34.     // extract substring
  35.     string s5 = s1.substr(6, 3);
  36.     cout << "s5 = " << s5 << endl;
  37.    
  38.     // replace 'voila' by 'voici' takes the 5 first characters
  39.     s1.replace(0, 5, "voici des");
  40.     cout << "s1 = " << s1 << endl;
  41.    
  42.     string x("il etait");
  43.     string y("une fois");
  44.     string z(" ");
  45.     string t = x + z + y;
  46.     cout << "t = " << t << endl;
  47.    
  48.     return 0;  
  49. }
  50.  
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

  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main() {
  6.     string s1("coucou, dit le coucou au long cou.");
  7.     cout << s1 << endl;
  8.  
  9.     string le("le");
  10.     string::size_type pos = s1.find(le);
  11.     cout << "string " << le << " found at position " << pos << endl;
  12.    
  13.     // -----------------------------
  14.     // find all occurrences of 'cou'
  15.     // -----------------------------
  16.     string cou("cou");
  17.     pos = 0;
  18.     pos = s1.find(cou, pos);
  19.     while (pos != string::npos) {
  20.         cout << "string " << cou << " found at position " << pos << endl;
  21.         ++pos;
  22.         pos = s1.find(cou, pos);
  23.     }
  24.    
  25.     // --------------------------------
  26.     // replace all occurrences of 'cou'
  27.     // --------------------------------
  28.     string match("cou");
  29.     string replace("do");
  30.     pos = 0;
  31.     pos = s1.find(match, pos);
  32.     while (pos != string::npos) {
  33.         s1.replace(pos, match.size(), replace);
  34.         ++pos;
  35.         pos = s1.find(match, pos);
  36.     }
  37.     cout << "s1 = " << s1 << endl;
  38.        
  39.     // ----------------------------------------------- 
  40.     // find first occurrence of one character in a set
  41.     // -----------------------------------------------
  42.     pos = s1.find_first_of(",.");
  43.     cout << "found " << s1[pos] << " at position " << pos << endl;
  44.     return 0;  
  45. }
  46.  

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.

  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. // ----------------------------------------------
  6. // trim on left side of string
  7. // ----------------------------------------------
  8. void trim_left(string& s) {
  9.     string::size_type pos = s.find_first_not_of(" \t\n");
  10.     if (pos != 0) {
  11.         s.erase(0, pos);
  12.     }
  13. }
  14.  
  15. // ----------------------------------------------
  16. // trim on right side of string
  17. // ----------------------------------------------
  18. void trim_right(string& s) {
  19.     string::size_type pos = s.find_last_not_of(" \t\n");
  20.     if (pos != s.size()) {
  21.         s.erase(pos+1);
  22.     }
  23. }
  24.  
  25. // ----------------------------------------------
  26. // trim on left and right side of string
  27. // ----------------------------------------------
  28. void trim(string& s) {
  29.     trim_left(s);
  30.     trim_right(s);
  31. }
  32.  
  33. // ----------------------------------------------
  34. // main function
  35. // ----------------------------------------------
  36. int main() {
  37.     string s = "  \t\nvoici une chaine \t\t\t\n\n   ";
  38.    
  39.     cout << "s before trim = [" << s << "]" << endl;
  40.     trim(s);
  41.    
  42.     cout << "s after trim = [" << s << "]" << endl;
  43.     return 0;
  44. }
  45.  
s before trim = [  	
voici une chaine 			

   ]
s after trim = [voici une chaine]