Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
L a n g a g e   C

L e s   c h a î n e s   d e   c a r a c t è r e s






Généralités


 Une chaîne est un tableau de caractères dont le dernier élément significatif est le caractère '\0'. Il faut donc différencier la longueur maximale de la chaîne (c'est à dire la dimension donnée lors de la définition) de sa longueur réelle (c'est à dire le nombre de caractères jusqu'au premier '\0' rencontré) :

char chaine[10] = { 'b', 'o', 'n', 'j', 'o', 'u', 'r', '\0' };

 Cette déclaration définit et initialise une chaîne de caractères, ce qui s'écrit plus simplement :

char chaine[10] = "bonjour"; /* le '\0' est implicite */

 La chaîne a ici une longueur maximale de 10 (9 caractères quelconques plus le '\0' final) et sa longueur effective est 7.

char chaine1[] = "bonjour"; /* dimensionne chaine1 à 8 caractères */
char *chaine2 = "bonjour";  /* autre chaîne de caractères */

 Pourtant chaine1 et chaine2 ne sont pas équivalentes : chaine1 est un tableau implanté à une adresse fixe. Pour changer la valeur de chaine1, il est nécessaire de modifier les caractères composant la chaîne "bonjour", chaine2 est par contre un pointeur sur une chaîne constante "bonjour", mais rien n'empêche de changer la valeur de ce pointeur par :

chaine2 = "salut";






 La variable chaine2 pointe maintenant vers une nouvelle constante, aucune recopie de caractère n'a été effectuée.

 Les remarques faites sur les tableaux (voir opérations sur les tableaux) sont valables ici :

char chaine1[10];
chaine1 = "bonjour"; /* illégal */

char *chaine2;
chaine2 = "bonjour"; /* correct */

 La fonction strcpy permet de recopier les chaînes de caractères, et résoud le problème de l'affectation d'une valeur à chaine1 :

char chaine1[10];
strpcy (chaine1,"bonjour");





 De même pour :

char *chaine1 = "bonjour", *chaine2 = "bonjour";

 L'expression chaine1 == chaine2 peut être vraie ou fausse suivant que le compilateur fusionne ou non les constantes identiques (auquel cas les deux adresses sont identiques). Pour comparer le contenu de deux chaînes de caractères on utilise la fonction strcmp :

strcmp (chaine1, chaine2);

 Indique dans ce cas si les chaînes sont formées des mêmes caractères.

 Les fonctions de traitement de chaînes de caractères de la librairie standard, généralement de la forme str...(...) , supposent que toute chaîne est terminée par '\0'. Elles font en sorte de générer des chaînes terminées par '\0' :

char chaine1[6] = "salut", chaine2[6];
chaine1[5] = '!'; /* chaine1 n'est plus terminée par '\0' */
strcpy (chaine2, chaine1);

L'affectation du caractère '!' supprime le '\0' final de chaine1, la recopie de strcpy s'effectuera jusqu'à rencontrer un 0 en mémoire, ce qui provoque un débordement de chaine2.


Tableaux de chaînes de caractères


 Les tableaux de chaînes de caractères sont des tableaux de tableaux de caractères :

char tab[5][10] = { "zero", "un", "deux", "trois", "quatre" };

 implémentés de cette façon :



 On constate que le tableau contient de l'espace inutilisé relativement important (près de la moitié). Pour minimiser la mémoire nécessaire au stockage des chaînes, on peut déclarer tab comme un tableau de pointeurs :

char *tab[5] = { "zero", "un", "deux", "trois", "quatre" };

 ce qui donne comme implémentation :



 Un tableau dynamique de chaînes de caractères se déclarera :

char **tab;

 La première allocation se fera par rapport au nombre de chaînes à manipuler, et pour chacune de ces chaînes il faudra allouer un espace suffisant pour stocker les caractères :

char **tab, buffer[MAX];

tab = malloc (nb * sizeof(char *));
for (i = 0; i < nb; i++)
{
 gets (buffer);
 lg = strlen (buffer);
 tab[i] = malloc ( (lg + 1) * sizeof(char) );
 strcpy (tab[i], buffer);
}

 L'erreur à ne pas commettre :

tab = malloc (nb * sizeof (char *));
for (i = 0; i < nb; i++)
{
 gets (buffer);
 strcpy (tab[i], buffer);
}



  Retour en haut de page Page suivante