Classe std::string et les chaînes de caractères en C++
Si vous me demandez quel type de données est le plus intéressant utilisé dans le langage de programmation, je vous dirai chaine de caractères sans même y penser. Les chaînes sont utilisées partout, c'est pourquoi dans ce cours nous aborderons en détail ce type de données
C++ fournit les deux types de représentations de string :
- Chaines de caractères classiques du langage C: Cliquez ici pour voir le style C
- La classe std::string
Chaines de caractères classiques du langage C
La chaîne de caractères de style C provient du langage C et continue d'être prise en charge dans C++. Cette chaîne est en fait un tableau de caractères à une dimension qui se termine par un caractère nul '\0'.
Dans ce cours nous n'aborderons pas cette représentation veuillez cliquer ici pour lire en détail cette représentation dans notre tutoriel C
Fonctions du style C
C++ prend en charge de nombreuses fonctions qui manipulent des chaînes de caractères. toutes ces fonctions sont définies dans le fichier d'en-tête <cstring>.
strcpy
La fonction strcpy() en C++ copie une chaîne de caractères de la source à la destination.
char* strcpy( char* dest, const char* src );
La fonction strcpy() prend deux arguments : dest et src. Elle copie la chaîne de caractères pointée par src vers l'emplacement mémoire pointé par dest. Le caractère de fin nul est également copié.
- dest : pointeur vers un tableau de caractères dans lequel le contenu est copié.
- src : pointeur vers un tableau de caractères à partir duquel le contenu est copié.
#include <cstring> #include <iostream> using namespace std; int main() { char src[] = "Hello from Morocco."; /* Assez grand pour stocker le contenu de src */ char dest[20]; strcpy(dest,src); cout << dest; return 0; }
Hello from Morocco.
strcat
La fonction strcat() en C++ ajoute une copie d'une chaîne de caractères à la fin d'une autre chaîne de caractères.
char* strcat( char* dest, const char* src );
La fonction strcat() prend deux arguments : dest et src. Cette fonction ajoute une copie de la chaîne de caractères pointée par src à la fin de la chaîne pointée par dest. Le caractère de fin nul à la fin de dest est remplacé par le premier caractère de src et la chaîne de caractères résultante se termine également par un nul.
- dest : pointeur vers un tableau de caractères où ajouter.
- src : pointeur vers un tableau de caractères à ajouter.
#include <cstring> #include <iostream> using namespace std; int main() { char dest[50] = "Morocco is a beautiful country"; char src[50] = " and exciting"; strcat(dest, src); cout << dest ; return 0; }
Morocco is a beautiful country and exciting
strlen
La fonction strlen() en C++ renvoie la longueur de la chaîne de caractères donnée.
size_t strlen( const char* str );
Le strlen() prend une chaîne de caractères str comme argument et renvoie sa longueur. La longueur n'inclut pas le caractère nul. S'il n'y a pas de caractère nul dans la chaîne, le comportement de la fonction est indéfini.
#include <cstring> #include <iostream> using namespace std; int main() { char src[50] = "Morocco is a beautiful country"; int n = strlen(src); cout << "la longueur de src est : "<<n ; return 0; }
la longueur de src est :30
strcmp
La fonction strcmp() en C++ compare deux chaînes. La comparaison se fait lexicographiquement.
int strcmp( const char* str1, const char* str2 );
La fonction strcmp() prend deux arguments : str1et str2. Elle compare le contenu de str1et str2 lexicographiquement. Le signe du résultat est le signe de la différence entre les premières paires de caractères qui diffèrent dans str1 et str2.
La fonction strcmp() renvoie un :
- Une valeur positive si le premier caractère différent de str1 est supérieur au caractère correspondant de str2./li>
- Une valeur négative si le premier caractère différent de str1 est inférieur au caractère correspondant de str2.
- 0 si str1 et str 2 sont égales.
#include <cstring> #include <iostream> using namespace std; int main() { char str1[] = "We love France"; char str2[] = "We love Morocco"; char str3[] = "we love morocco"; char str4[] = "we love morocco"; // str2 est plus grande que str1 (puisque M > F ) cout << "str1 et str2 : "<<strcmp(str1,str2)<<endl; // str3 est plus grande que str2 (caractère miniscule est plus grand que le majiscule ) cout << "str2 et str3 : "<<strcmp(str3,str2)<<endl; // str3 et str4 sont égales cout << "str3 et str4 : "<<strcmp(str3,str4)<<endl; return 0; }
str1 et str2 : -1 str2 et str3 : 1 str3 et str4 : 0
strchr
La fonction strchr() en C++ recherche la première occurrence d'un caractère dans une chaîne.
const char* strchr( const char* str, int ch ); char* strchr( char* str, int ch );
La fonction strchr() prend deux arguments : str et ch. Elle recherche le caractère ch dans la chaîne de caractères pointée par str.
Si le caractère est trouvé, la fonction strchr() renvoie un pointeur vers l'emplacement du caractère dans str, sinon renvoie un pointeur nul.
#include <cstring> #include <iostream> using namespace std; int main() { char str[] = "We love France."; char ch = 'v'; if (strchr(str, ch)) cout << ch << " est present dans \"" << str << "\""; else cout < ch < " n'est pas present dans \"" < str < "\""; return 0; }
strstr
La fonction strstr() en C++ recherche la première occurrence d'une sous-chaîne dans une chaîne de caractères.
const char* strstr( const char* str, const char* cible ); char* strstr( char* str, const char* cible );
La fonction strstr() prend deux arguments : str et cible. Elle recherche la première occurrence de cible dans la chaîne de caractères pointée par str. Les caractères nuls de fin sont ignorés.
- Si la sous-chaîne est trouvée, la fonction strstr() renvoie le pointeur sur le premier caractère de la sous-chaîne dans src.
- Si la sous-chaîne n'est pas trouvée, un pointeur nul est renvoyé.
- Si cible pointe vers une chaîne vide, str est renvoyé
#include <cstring> #include <iostream> using namespace std; int main() { char str[] = "Learning programming is the best learning process you will enjoy"; char cible[] = "programming"; char *p = strstr(str, cible); if (p) cout << "'" << cible << "' est presente dans \"" << str < "\" a l'indice " < p-str; else cout < cible < " n'est pas presente \"" < str < "\""; return 0; }
'programming' est presente dans "Learning programming is the best learning process you will enjoy" a l'indice 9
La classe std::string
La bibliothèque C++ standard fournit un type de classe std::string qui prend en charge toutes les opérations mentionnées ci-dessus, ainsi que beaucoup plus de fonctionnalités qui simplifient l'utilisation de chaines de caractères. Pour utiliser cette classe, vous devez utiliser le fichier d'en-tête <string>
Nous présenterons dans ce cours les fonctions les plus utilisées dans la classe std::string pour manipuler des chaînes.
Fonctions d'entrée
- getline(): Cette fonction permet de stocker un flux de caractères saisis par l'utilisateur.
- push_back(): Cette fonction permet d'insérer un caractère à la fin de la chaîne de caractères.
- pop_back(): Introduite depuis C++11 (pour les chaînes), cette fonction est utilisée pour supprimer le dernier caractère de la chaîne de caractères.
#include <iostream> #include <string> using namespace std; int main() { string str; getline(cin,str); cout << "La chaine de caracteres initiale est : "; cout << str << endl; str.push_back('a'); cout << "La chaine de caracteres apres l'operation push_back est : "; cout << str << endl; str.pop_back(); cout << "La chaine de caracteres apres l'operation pop_back est : "; cout << str << endl; return 0; }
We love France La chaine de caracteres initiale est : We love France La chaine de caracteres apres l'operation push_back est : We love Francea La chaine de caracteres apres l'operation pop_back est : We love France
Fonctions de capacité
- capacity(): Cette fonction renvoie la capacité allouée à la chaîne, qui peut être égale ou supérieure à la taille de la chaîne. Un espace supplémentaire est alloué afin que lorsque les nouveaux caractères sont ajoutés à la chaîne, les opérations puissent être effectuées efficacement.
- resize(): Cette fonction modifie la taille de la chaîne, la taille peut être augmentée ou diminuée.
- length(): Cette fonction trouve la longueur de la chaîne
- shrink_to_fit(): Cette fonction diminue la capacité de la chaîne et la rend égale à la capacité minimale de la chaîne. Cette opération est utile pour économiser de la mémoire supplémentaire si l'on est sûr qu'il n'y a plus besoin d'ajouter de caractères.
#include <iostream> #include <string> using namespace std; int main() { string str = "Morocco is a beautiful country"; cout << "La chaine initiale est : "; cout << str << endl; str.resize(13); cout << "La chaine apres resize est : "; cout << str << endl; cout << "La capacite de la chaine est : "; cout << str.capacity() << endl; cout<<"La taille de la chaine est :"<<str.length()<<endl; str.shrink_to_fit(); cout << "La nouvelle capacite apres shrink_to_fit est : "; cout << str.capacity() << endl; return 0; }
La chaine initiale est : Morocco is a beautiful country La chaine apres resize est : Morocco is a La capacite de la chaine est : 30 La taille de la chaine est :13 La nouvelle capacite apres shrink_to_fit est : 15
Fonctions de manipulation
- Concaténation: Pour concaténer deux chaînes, nous utilisons uniquement l'opérateur +
- compare(): Elle est utiliséepour comparer deux chaînes. Elle renvoie la différence entre la deuxième chaîne et la première chaîne en entier.
#include <iostream> #include <string> using namespace std; int main() { string str1 = "Beautiful"; string str2 = " and amazing"; string str3=str1+str2; cout << "Apres concatenation " << str3 << endl; if ( str1.compare(str2) == 0 ) cout << "sont egales"; else cout << "ne sont pas egales"; return 0; }
Apres concatenation Beautiful and amazing ne sont pas egales
- find(): Recherche dans la chaîne la première occurrence de la sous-chaîne spécifiée dans les arguments. Elle renvoie la position de la première occurrence de sous-chaîne.
- find_first_of(): Recherche dans la chaîne le premier caractère qui correspond à l'un des caractères spécifiés dans ses arguments. Elle renvoie la position du premier caractère qui correspond.
- find_last_of(): Recherche dans la chaîne le dernier caractère qui correspond à l'un des caractères spécifiés dans ses arguments. Elle renvoie la position du dernier caractère qui correspond..
- rfind(): Recherche dans la chaîne la dernière occurrence de la sous-chaîne spécifiée dans l'argument. Elle renvoie la position de la dernière occurrence de la sous-chaîne
#include <iostream> #include <string> using namespace std; int main() { string str = "Meknes is a city in morocco, Rabat is also a city"; cout << "Premiere occurence de \"city\" est a l'indice "; cout << str.find("city") << endl; cout << "Premiere occurence de \"is\" est a l'indice "; cout << str.find_first_of("is") << endl; cout << "Derniere occurence de \"is\" est a l'indice : "; cout << str.find_last_of("is") << endl; cout << "Derniere occurence de \"city\" commence a partir de : "; cout << str.rfind("city") << endl; return 0; }
Premiere occurence de "city" est a l'indice 12 Premiere occurence de "is" est a l'indice 5 Derniere occurence de "is" est a l'indice : 46 Derniere occurence de "city" commence a partir de : 45
- insert(): insert(debut,str): Cette fonction insère la sous-chaîne donnée dans la chaîne. Elle prend deux arguments, d'abord la position à partir de laquelle vous souhaitez insérer la sous-chaîne et ensuite la sous-chaîne.
- clear(): Cette fonction efface tous les caractères de la chaîne. La chaîne devient vide (la longueur devient 0) après cette opération.
- empty(): Teste si la chaîne est vide. Cette fonction renvoie une valeur booléenne
#include <iostream> #include <string> using namespace std; int main() { string str = "Morocco and "; cout << "Avant l'insertion : " << str << endl; str.insert(12,"Fance"); cout << "Apres insertion : " << str << endl; str.clear(); cout << "Apres clear '" << str << "'" << endl; if(str.empty()==1){ cout << "la chaine est vide" << endl; } else{ cout << "la chaine est non vide" << endl; } return 0; }
Avant l'insertion : Morocco and Apres insertion : Morocco and Fance Apres clear '' la chaine est vide