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;
}