Programmation C++ (débutant)/Les tableaux de char
string ou tableaux de char
En C++, il existe plusieurs façons de représenter les chaînes de caractères : on peut utiliser la classe prédéfinie string ou on peut utiliser des tableaux de char. On parle alors parfois de chaîne de caractères de style C.
Pour des raisons pédagogiques qui nous semblent fondamentales, nous allons étudier les chaînes de caractères représentées par des tableaux de char.
Ceci nous permettra de mettre en évidence les insuffisances de cette représentation et pourquoi il est largement préférable d’utiliser la classe string. Il faut avoir en tête que la classe string fait appel à des notions finalement très complexes (l’allocation dynamique de mémoire notamment, ou encore les pointeurs), même si son emploi est très simple.
Chaînes de caractères de style C
Une telle chaîne de caractères est contenue dans un tableau de char. Chaque caractère sera dans une case du tableau. A la fin d’une chaîne de caractères (qui n’est pas forcément à la dernière case du tableau) doit se trouver le caractère spécial noté ‘\0’ qui indique la fin de la chaîne.
Affichage et saisie d’une chaîne
On peut afficher une chaîne de caractères par cout : le tableau de caractères sera alors affiché jusqu’au caractère de fin de chaîne.
On peut saisir une chaîne par cin : le caractère de fin de chaîne est alors rajouté automatiquement.
On peut accéder au caractère numéro i d’une chaîne t en indexant le tableau t[i].
Exemple 1 : affichage et saisie
Dans cet exemple, on déclare un tableau de 20 char noté tt : dans chaque case de 0 à 7 on place une lettre et dans la case 8 on place le caractère de fin de chaîne.
#include <iostream>
using namespace std;
int main()
{
char tt[20];
tt[0] = ‘B’;
tt[1] = ‘O’;
tt[2] = ‘N’;
tt[3] = ‘J’;
tt[4] = ‘O’;
tt[5] = ‘U’;
tt[6] = ‘R’;
tt[7] = ‘\0’;
cout << tt;
return 0;
}
• Explications
tt contient la chaîne de caractères « BONJOUR ». Nous avons construit case par case cette chaîne ! En général, on utilisera des fonctions prédéfinies nous permettant de faire cela ! On peut afficher cette chaîne par un simple cout. Remarque : dans la pratique, on ne copiera JAMAIS lettre par lettre une chaîne dans un tableau.
• Exécution
Lorsqu’on exécute le programme voici ce qu’on obtient à l’écran :
BONJOUR
Exemple 2 : saisie d’une chaîne
#include <iostream>
using namespace std;
int main()
{
char tt[20];
cout << « Tapez une chaîne SVP : « ;
cin >> tt;
cout << « Vous avez tapé la chaîne : « ;
cout << tt << endl;
return 0;
}
• Explications
• On déclare un tableau de 20 char noté tt.
• On saisit une chaîne de caractères grâce à cin.
• On affiche alors la chaîne de caractères qu’on vient de taper par un cout.
• Exécution
Lorsqu’on exécute le programme voici ce qu’on obtient à l’écran :
Tapez une chaîne SVP : BONJOUR
Vous avez tapé la chaîne : BONJOUR
Remarque: le tableau tt est limité à 20 caractères. Cependant une entrée de 30 caractères les affiche aussi bien !! Où est l’erreur ?
Manipulation de chaînes
Les chaînes de caractères sont contenues dans des tableaux de char, il existe de nombreuses fonctions prédéfinies dans le fichier cstring qui permettent de manipuler simplement ces tableaux. Ainsi, on peut aisément copier, comparer, transformer… des chaînes de caractères. Nous allons étudier quelques-unes de ces fonctions standard.
Comparaison de 2 chaînes
On ne teste pas l’égalité de 2 chaînes par ==, on utilise strcmp(chaine1,chaine2) qui renvoie :
0 si les 2 chaînes sont égales.
un nombre <0 si chaîne1 est avant chaîne2 dans l’ordre lexicographique.
un nombre >0 si chaîne1 est après chaîne2 dans l’ordre lexicographique.
Pour utiliser strcmp, il faut inclure cstring.
Exemple 3 : comparaison de 2 chaînes
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char tt[20];
cout << « Tapez une chaîne : « ; cin >> tt;
if(strcmp(tt, « BONJOUR »)==0)
cout<<« GAGNE »<<endl;
else cout<<« PERDU »<<endl;
return 0;
}
• Explications
• Dans cet exemple, on commence par demander à l’utilisateur de saisir une chaîne de caractères tt.
• Grâce à la fonction strcmp, on va comparer cette chaîne à la chaîne « BONJOUR ».
• Si on a tapé la chaîne « BONJOUR », on affichera le message « GAGNE », sinon on affichera le message « PERDU ».
• Exécution 1
Lorsqu’on exécute le programme voici ce qu’on obtient à l’écran :
Tapez une chaîne : BONSOIR
PERDU
• Exécution 2
Lorsqu’on exécute le programme voici ce qu’on obtient à l’écran :
Tapez une chaîne : BONJOUR
GAGNE
Exemple 4 : ordre lexicographique
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[20];
cout << « Tapez une chaîne : « ; cin >> a;
if (strcmp(a, »BONJOUR »)>0)
cout << a << » est après BONJOUR » << endl;
else
cout << a << » est avant BONJOUR » << endl;
return 0;
}
• Explications
• Dans cet exemple, on demande à l’utilisateur de saisir une chaîne de caractères a.
• On compare ensuite cette chaîne à la chaîne de caractères « BONJOUR ».
• Si la chaîne tapée se trouve avant « BONJOUR » dans l’ordre lexicographique, on affiche un message indiquant que la chaîne se trouve avant « BONJOUR ».
• Si la chaîne se trouve après « BONJOUR », on affiche un message similaire.
• Exécution 1
Lorsqu’on exécute le programme voici ce qu’on obtient à l’écran :
Tapez une chaîne : AAA
AAA est avant BONJOUR
• Exécution 2
Lorsqu’on exécute le programme voici ce qu’on obtient à l’écran :
Tapez une chaîne : ZZZ
ZZZ est après BONJOUR
Copie d’une chaîne
On n’utilise pas l’affectation pour copier une chaîne dans une autre.
On utilise strcpy(chaine1,chaine2) qui copie la deuxième chaîne dans la première.
Exemple 5
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[20], b[20];
strcpy(a, « BONJOUR »);
strcpy(b, a);
cout << « La chaîne b vaut : » << b << endl; return 0;
}
• Explications
• Dans cet exemple, on déclare 2 chaînes de caractères a et b.
• On copie la chaîne « BONJOUR » dans a en utilisant strcpy.
• On copie ensuite la chaîne a dans la chaîne b toujours en utilisant strcpy.
• On affiche ensuite la chaîne b.
• Exécution
Lorsqu’on exécute le programme voici ce qu’on obtient à l’écran :
La chaîne b vaut BONJOUR
Longueur d’une chaîne
• La fonction strlen permet de connaître le nombre de caractères d’une chaîne.
• On ne tient pas compte du caractère de fin de chaîne lorsqu’on compte les caractères.