tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
ISIMA
  • twitter
  • linkedin
  • viadeo

[C++] std::string

Read in English

Date de première publication : 2013/09/25

La chaîne de caractères

Nous allons voir quelques manipulations basiques sur les chaînes de caractères. Si en C elles sont représentées par un tableau de caractères qui se termine par le caractère '\0', on préfère utiliser la classe std::string définie dans l'entête standard string.

La classe std::string propose en fait une encapsulation de la chaîne de caractères C. La bibliothèque standard du C++ propose d'autres types de chaînes de caractères, notamment celles qui sont capables de gérer un encodage comme l'UTF-8 où un caractère est stocké sur plusieurs octets.

Cette page n'est pas censée se substituer à la documentation officielle mais j'espère qu'elle est plus accessible lorsque l'on est au tout début de son apprentissage du C++ !

Instanciation de chaînes

std::string   s1;
std::string   s2("chaine 2");
std::string   s3 = "chaine 3";

Manipulation basique

  s2 = s3; // affectation
  
  std::cout << s2; // affichage sur la sortie standard
  std::cin  >> s3; // saisie sur l'entrée standard

  std::cout << (s1.empty()?"chaine vide":"chaine non vide");
  
  // taille des chaînes
  std::cout << s1.length() << std::endl;
  std::cout << s2.size()   << std::endl;

  // vider la chaîne
  s3.clear();

Lire un flux sur l'entrée standard avec std::cin >> s ne permet pas de récupérer un élément contenant un espace, une tabulation, ... Il faut utiliser la methode getline() comme cela :

getline(std::cin, s1);

Comparaison

Contrairement au C, les opérateurs usuels (égalité, comparaison) s'appliquent sur les chaînes de caractères C++

  if (s2==s3) std::cout << "les chaines sont egales" ;
  if (s2!=s3) std::cout << "les chaines sont differentes" ;
  if (s2< s3) std::cout << s2 << " est plus petite que " << s3;
  if (s2> s3) std::cout << s2 << " est plus grande que " << s3;
  if (s2.compare(s3)==0) std::cout << "les chaines sont égales" ;
  if (s3.compare("loic")==0) std::cout << "s3 est identifié :-)" ;

Le premier ou la première qui fait la remarque que je n'ai pas utilisé de if else pour les tests ... aura une sale note à son examen final. Ce sont des exemples !

Accès à un caractère

On manipule une chaîne C++ comme une chaîne C : on peut utiliser les crochets pour accéder à un élément même si la chaîne C++ n'est pas un tableau. Nous verrons plus tard comme on peut faire cela.

  // lecture d'un caractère
  std::cout << s2[3];    // 4eme caractère
  std::cout << s2.at(3); // 4eme caractère
  
  // modification de caractère
  s2[2]    = 'A';
  s2.at(3) = 'B';

Concaténation

  // même résultat
  s2 += s3;
  s2.append(s3);

Mécanique interne

Comme dit en introduction, la chaîne C++ encapsule une chaîne de caractère à la C. c_str() est une accesseur à cette chaîne C

std::cout << s2.c_str();
std::cout << (int) s2.c_str()[s2.length()];

Autres opérations : insert/erase, replace, substr, find

s1.insert(3, s2); // insère s2 à la position 3
s3.erase(0, 4);   // efface les 4 premiers caractères
s3.erase(1, 2);   // efface deux caractères à partir de la position 1
s3.replace(2,3,s1); // remplace la portion de s3 définie de la position 2 à 5 par la chaîne s1
s = s1.substr(4,2); // extrait 2 caractères à partir de la position 4
unsigned int i = s.find("trouve", 4); // recherche "trouve" à partir de la 4ème position, renvoie std::string::npos le cas échéant

Conversion vers/à partir d'un autre type

L'astuce pour la conversion est d'utiliser un flux spécifique, un flux chaîne de caractères et non un flux fichier (Les flux fichier sont vus au TP 2).

L'entête à inclure est sstream.

Pour transformer un entier en chaîne de caractères, il faut utiliser le code suivant :

std::ostringstream oss;
// écrire la valeur dans le flux et tout ce que l'on veut
oss << valeur_entiere;
std::cout << "Résultat" << oss.str();

Pour décryper une valeur donnée par une chaîne de caractères, il faut plutôt faire la chose suivante :

std::istringstream iss(chaine_a_decrypter);
iss >> entier;

Différents types de chaînes de caractères

Si vous allez dans la documentation officielle, vous verrez qu'il y a différents types de chaînes de caractères.

A terme, vous pourez vous poser la question : parmi tous ces types, lesquels sont des chaînes de caractères C++ ?

std::string s1;
const char * s2;
char * s3;
char s4[256];

Aller plus loin (fin de cours ZZ2)

Malheureusement, C++ n'est pas aussi complet que Java ou C# sur les manipulations de chaînes de caractères. Nous serons en mesure d'expliquer un peu plus tard comment, par exemple, transformer une chaîne de caractères en majuscules. Si vous ne pouvez pas attendre, attention, ça pique !

// Exemple tiré de la FAQ C++ de Développez.com

#include <cctype>    // pour tolower et toupper
#include <string>    // pour string
#include <ostream>   // pour cout
#include <algorithm> // pour transform
  
struct my_toupper
{ 
    char operator()(char c) const 
    {
        return std::toupper(static_cast<unsigned char>(c));
    } 
};
 
int main()
{
    std::string s("abcdef");

    std::transform(s.begin(), s.end(), s.begin(), my_toupper());
    std::cout << s; // affiche "ABCDEF"
 
    return 0;
}