Les chaines de caractères dans C++
La classe de chaîne a été brièvement introduite dans un chapitre précédent. C’est une classe très puissante pour manipuler et manipuler des chaînes de caractères. Cependant, comme les chaînes sont en fait des séquences de caractères, nous pouvons les représenter également sous forme de tableaux simples d’éléments de type caractère.
Par exemple, le tableau suivant:
char foo [11];
est un tableau pouvant stocker jusqu’à 11 éléments de type char. Il peut être représenté comme:
foo :
Par conséquent, ce tableau a la capacité de stocker des séquences de 11 caractères maximum. Mais cette capacité n’a pas besoin d’être complètement épuisée: le tableau peut également accueillir des séquences plus courtes. Par exemple, à un moment donné du programme, la séquence « Bonjour » ou la séquence « Mes amis » peut être stockée dans foo, car les deux peuvent tenir dans une séquence d’une capacité de 11 caractères.
foo :
B | o | n | j | o | u | r | \ 0 |
M | e | s | a | m | i | s | \ 0 |
Par convention, la fin des chaînes représentées dans les séquences de caractères est signalée par un caractère spécial: le caractère nul, dont la valeur littérale peut être écrite sous la forme ‘\ 0’ (barre oblique inverse, zéro).
Dans ce cas, le tableau de 11 éléments de type char appelé foo peut être représenté en stockant les séquences de caractères « Bonjour » et « Mes amis » sous la forme:
Remarquez qu’après le contenu de la chaîne elle-même, un caractère nul (‘\ 0’) a été ajouté afin d’indiquer la fin de la séquence. Les panneaux en gris représentent des éléments de caractère avec des valeurs indéterminées.
Initialisation d’une chaîne de caractères
Les tableaux de caractères étant des tableaux ordinaires, ils suivent les mêmes règles. Par exemple, pour initialiser un tableau de caractères avec une séquence de caractères prédéterminée, nous pouvons le faire comme n’importe quel autre tableau:
char myword [] = {'B', 'o', 'n', 'j', 'o','u','r', '\ 0'};
La déclaration ci-dessus déclare un tableau de 6 éléments de type char initialisés avec les caractères formant le mot « Hello » plus un caractère nul « \ 0 » à la fin.
Mais les tableaux d’éléments de caractères ont une autre façon d’être initialisés: utiliser directement les littéraux de chaîne.
Dans les expressions utilisées dans certains exemples des chapitres précédents, les littéraux de chaîne ont déjà été affichés à plusieurs reprises. Celles-ci sont spécifiées en mettant le texte entre guillemets doubles (« ). Par exemple:
"le résultat est: "
C’est un littéral de chaîne, probablement utilisé dans un exemple précédent.
Les séquences de caractères entre guillemets (« ) sont des constantes littérales. Et leur type est, en fait, un tableau de caractères terminé par un caractère null. Cela signifie que les littéraux de chaîne ont toujours un caractère nul (‘\ 0’) automatiquement ajouté à la fin.
Par conséquent, le tableau d’éléments char appelé myword peut être initialisé avec une séquence de caractères terminée par un caractère nul par l’une ou l’autre de ces deux instructions:
char myword [] = {'B', 'o', 'n', 'j', 'o','u','r', '\ 0'}; char myword [] = "Bonjour";
Dans les deux cas, le tableau de caractères myword est déclaré avec une taille de 6 éléments de type char: les 5 caractères composant le mot « Hello », plus un caractère nul final (‘\ 0’), qui spécifie la fin du caractère. séquence et que, dans le second cas, l’utilisation des guillemets doubles (« ) est ajoutée automatiquement.
Veuillez noter que nous parlons ici d’initialiser un tableau de caractères au moment où il est déclaré, et non pas de leur attribuer des valeurs plus tard (une fois qu’ils ont déjà été déclarés). En fait, les littéraux de chaîne étant des tableaux normaux, ils ont les mêmes restrictions et ne peuvent pas recevoir de valeurs.
Expressions (une fois que myword a déjà été déclaré comme ci-dessus), telles que:
myword = "Bye"; myword [] = "Bye";
ne serait pas valide, comme le serait ni:
myword = {'B', 'y', 'e', '\ 0'};
En effet, les tableaux ne peuvent pas recevoir de valeurs. Notez cependant que chacun de ses éléments peut recevoir une valeur individuellement. Par exemple, cela serait correct:
myword [0] = 'B'; myword [1] = 'y'; myword [2] = 'e'; myword [3] = '\ 0';
Chaînes de caractères et séquences de caractères à zéro terminal
Les tableaux simples avec des séquences de caractères terminées par zéro sont les types typiques utilisés dans le langage C pour représenter les chaînes (c’est pourquoi ils sont également appelés chaînes C). En C ++, même si la bibliothèque standard définit un type spécifique pour les chaînes (chaîne de classe), les tableaux simples comportant des séquences de caractères à terminaison nulle (chaînes C) constituent un moyen naturel de représenter des chaînes dans le langage; en fait, les littéraux de chaîne produisent toujours toujours des séquences de caractères terminées par un caractère null, et non des objets de chaîne.
Dans la bibliothèque standard, les deux représentations des chaînes (chaînes C et chaînes de la bibliothèque) coexistent et la plupart des fonctions nécessitant des chaînes sont surchargées pour les prendre en charge.
Par exemple, cin et cout supportent directement les séquences à terminaison nulle, ce qui leur permet d’être directement extraites de cin ou insérées dans cout, tout comme les chaînes. Par exemple:
// chaînes et NTCS: #include <iostream> #include <string> using namespace std; int main () { char question1 [] = "Quel est votre nom?"; string question2 = "Où habitez-vous?"; char reponse1 [80]; chaîne reponse2; cout << question1; cin >> reponse1; cout << question2; cin >> reponse2; cout << "Bonjour" << réponse1; cout << "de" << reponse2 << "! \ n"; return 0; }
Quel est votre nom?? Homère Où habitez-vous? Grèce Bonjour, Homère de Grèce!
Dans cet exemple, les deux tableaux de caractères utilisant des séquences et des chaînes à zéro terminal sont utilisés. Leur utilisation est assez interchangeable avec cin et cout, mais leurs déclarations présentent une différence notable: les tableaux ont une taille fixe qui doit être spécifiée implicitement ou explicitement lors de la déclaration; question1 a exactement une taille de 20 caractères (y compris les caractères nuls de fin) et reponse1 a une taille de 80 caractères; alors que les chaînes sont simplement des chaînes, aucune taille n’est spécifiée. Cela est dû au fait que les chaînes ont une taille dynamique déterminée lors de l’exécution, tandis que la taille des tableaux est déterminée lors de la compilation, avant l’exécution du programme.
Dans tous les cas, les séquences de caractères et les chaînes de caractères terminées par un caractère nul se transforment facilement les unes des autres:
Les séquences de caractères à terminaison nulle peuvent être transformées implicitement en chaînes, et les chaînes peuvent être transformées en séquences de caractères à terminaison null en utilisant l’une des fonctions membres de la chaîne c_str ou data:
char myntcs [] = "du texte"; string mystring = myntcs; // convertit une chaîne de caractères en chaîne cout << mystère; // imprimé en tant que chaîne de bibliothèque cout << mystring.c_str (); // imprimé en c-string
(note: c_str et data de string sont équivalents)