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






Gnralits


 Une chane est un tableau de caractres dont le dernier lment significatif est le caractre '\0'. Il faut donc diffrencier la longueur maximale de la chane (c'est dire la dimension donne lors de la dfinition) de sa longueur relle (c'est dire le nombre de caractres jusqu'au premier '\0' rencontr) :

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

 Cette dclaration dfinit et initialise une chane de caractres, ce qui s'crit plus simplement :

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

 La chane a ici une longueur maximale de 10 (9 caractres quelconques plus le '\0' final) et sa longueur effective est 7.

char chaine1[] = "bonjour"; /* dimensionne chaine1 8 caractres */
char *chaine2 = "bonjour";  /* autre chane de caractres */

 Pourtant chaine1 et chaine2 ne sont pas quivalentes : chaine1 est un tableau implant une adresse fixe. Pour changer la valeur de chaine1, il est ncessaire de modifier les caractres composant la chane "bonjour", chaine2 est par contre un pointeur sur une chane constante "bonjour", mais rien n'empche de changer la valeur de ce pointeur par :

chaine2 = "salut";






 La variable chaine2 pointe maintenant vers une nouvelle constante, aucune recopie de caractre n'a t effectue.

 Les remarques faites sur les tableaux (voir oprations sur les tableaux) sont valables ici :

char chaine1[10];
chaine1 = "bonjour"; /* illgal */

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

 La fonction strcpy permet de recopier les chanes de caractres, et rsoud le problme de l'affectation d'une valeur chaine1 :

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





 De mme 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 chanes de caractres on utilise la fonction strcmp :

strcmp (chaine1, chaine2);

 Indique dans ce cas si les chanes sont formes des mmes caractres.

 Les fonctions de traitement de chanes de caractres de la librairie standard, gnralement de la forme str...(...) , supposent que toute chane est termine par '\0'. Elles font en sorte de gnrer des chanes termines par '\0' :

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

L'affectation du caractre '!' supprime le '\0' final de chaine1, la recopie de strcpy s'effectuera jusqu' rencontrer un 0 en mmoire, ce qui provoque un dbordement de chaine2.


Tableaux de chanes de caractres


 Les tableaux de chanes de caractres sont des tableaux de tableaux de caractres :

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

 implments de cette faon :



 On constate que le tableau contient de l'espace inutilis relativement important (prs de la moiti). Pour minimiser la mmoire ncessaire au stockage des chanes, on peut dclarer tab comme un tableau de pointeurs :

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

 ce qui donne comme implmentation :



 Un tableau dynamique de chanes de caractres se dclarera :

char **tab;

 La premire allocation se fera par rapport au nombre de chanes manipuler, et pour chacune de ces chanes il faudra allouer un espace suffisant pour stocker les caractres :

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