Logo creanet 2.0
Les chaines de caractères

À partir d'ici nous allons enfin pouvoir commencer à manipuler du texteSmiley souris

J'ai préféré ne pas vous montrer comment manipuler du texte tout de suite comme les nombres car c'est "légèrement" plus difficile et vous n'aviez pas les connaissances adaptéesSmiley souris

Mais maintenant vous voilà près! Nous allons tout d'abord voir comment créer une chaine de caractère, comment cela fonctionne, en demander une à l'utilisateur, puis enfin découvrir quelques fonctions qui permettront de manipuler ces chaînes plus facilement Smiley souris
Here we go!Smiley rigole


Créer une chaine de caractères

Nous avions vu, il y a déjà quelque temps, comment créer une variable pouvant contenir une lettre. Il fallait écrire ceci:

char variable = 'A';

Jusque là, rien de nouveau.Smiley souris Mais ce n'est pas un hasard si nous avons vu les tableaux juste avant ce chapitre, car en fait:
 
une chaine de caractère n'est qu'un tableau de char


Ce qui veut dire que comme char sert à stocker des lettres, une chaine de caractères sera un tableau de lettres.


Voici donc un exemple:


char variable[10]; //On créer un tableau de 10 char.

//On met dans chaque case du tableau une lettre.
        variable[0] = 'C';
        variable[1] = 'r';
        variable[2] = 'e';
        variable[3] = 'a';
        variable[4] = 'n';
        variable[5] = 'e';
        variable[6] = 't';


En réalité, ceci n'est qu'à moitié correcte, car pour que l'ordinateur sache quand la chaine s'arrête, il faut placer un antislash suivi d'un zerocaractère d`échappement fin chaine (remarquez que ce signe est considéré comme un seul et unique caractère comme n'importe quel autre signe).

Il faut donc écrire pour que cela soit correct:


char variable[10]; //On créer un tableau de 10 char.

//On met dans chaque case du tableau une lettre.
        variable[0] = 'C';
        variable[1] = 'r';
        variable[2] = 'e';
        variable[3] = 'a';
        variable[4] = 'n';
        variable[5] = 'e';
        variable[6] = 't';
        variable[7] = 'caractère d`échappement fin chaine';

Pour afficher le texte, il suffit d'écrire:

printf("%s", variable);
 
Ce qui donne bien:
 
screen creanet tuto c chaine de caracteres

Vous avez réussi à afficher du texte! Bon on savait déjà le faire OK :P
Maintenant écrivez ceci:

char variable[10] = "Creanet";

et afficher la variable à l'aide de printf ... Cela revient strictement au même! Smiley rigole

Donc lors de la déclaration d'une variable de type char, si vous souhaitez placer du texte dedans en utilisant les tableaux, vous pouvez marquer directement le texte comme je viens de vous le montrer plutôt qu'un fastidieux:

        variable[0] = 'C';
        variable[1] = 'r';
        variable[2] = 'e';
        variable[3] = 'a';
            ..................


Mais je vous le rappelle:
 
Cela ne marche que pour l'initialisation de la variable!

De plus, vous pouvez écrire ceci à l'initialisation:

char variable[] = "Creanet";

La taille du tableau est calculée automatiquement et même le caractère de fin de chaine est pris en compte

Elle n'est pas belle la vie?Smiley rigole


Voyons maintenant comment demander à l'utilisateur une chaine de caractère.Smiley souris

Saisie d'une chaine de caractères

Tout simplement comme ceci:

char votreChaine[10];
scanf("%s", votreChaine); /*Ne mettez pas le signe '&' devant un tableau de type char! Le prochain chapitre rendera cela plus clairSmiley souris*/

et voilà, ce que l'utilisateur à rentré est maintenant stocké dans le variable "votreChaine"Smiley souris

 
panneau attentionAttentionpanneau attention
Si l'utilisateur rentre plus de texte que de cases possibles dans votre tableau le programme va planter (buffer overflow pour ceux qui connaissentSmiley souris). Il est donc impératif de bien prendre une taille de tableau en conséquence.


Les limites de scanf

Scanf est, certes, assez simple à utiliser mais pose néanmoins quelques problèmes et notamment de sécurité. Comme nous le verrons dans le chapitre sur la sécurité de vos applications. Nous allons tout de même l'utiliser, mais de façon contrôlée.

Par exemple, essayez ce code qui affiche ce que l'on a rentré:

char votreChaine[10];
scanf("%s", votreChaine); //On demande une chaine.
printf("%s", votreChaine); //On affiche cette chaine.



Essayez de rentrer "Bonjour toi!" (sans les guillemets). Cela nous donne:
 
limites de scanf tuto C


O.O

Oui il n'y a que le "Bonjour" d'affiché! Donc deux choses à retenir:

1) On fait attention à la taille du buffer!
2) On ne marque pas d'espace!

Nous verrons donc, comme je vous l'ai dit, dans le chapitre sur la sécurité des applications, pourquoi cela se déroule de cette façon et surtout comment l'éviterSmiley souris


Les différentes fonctions de gestion de chaines de caractères

Avant toute chose, il vous faut inclure une bibliothèqueSmiley souris Celle-ci se nomme string.h. Il faut donc écrire ceci:

#include <string.h>
Voyons maintenant les fonctions de manipulation de chaines de caractères les plus utilesSmiley souris


La longueur d'une chaine

Il vous sera peut être utile, parfois, de connaître la taille d'une chaine de caractères en particulier. Pour cela, il vous faut utiliser la fonction:

strlen(votreChaine);

Cette fonction revoie un type size_t (c'est un type créé spécialement pour cela, mais faites comme si c'était un intSmiley souris )

Exemple d'utilisation:

char maVariable[] = "Bonjour!";
printf("maVariable contient %d caracteres", sizeof(maVariable));
Tout simplementSmiley souris


Comparer deux chaines

La fonction permettant de regarder si deux chaines sont identiques est:

strcmp(chaine1, chaine2);

Cette fonction renvoie 0 si les chaines sont identiques et autre chose sinon.
On peut donc l'utiliser comme ceci:


char chaine1[] = "Exemple";
char chaine2[] = "Exemple";

if(strcmp(chaine1, chaine2) == 0)
{
     printf("Ce sont les memes chaines!");
}

else
{
     printf("Ces chaines ne sont pas pareilles!");
}


Ecrire dans une chaine

Si vous souhaitez, par exemple, écrire dans une chaîne une phrase suivie d'une variable par exemple comme ceci:

A ok! Vous avez donc X ans! //Où X est l'âge.
Et bien c'est possible grâce à la fonction sprintfSmiley souris

sprintf(chaineDestination, "Du texte", ...);

chaineDestination est la chaine de caractères qui va stocker la phrase formée au complet. Veillez donc bien à sa tailleSmiley souris Le deuxième paramètre de cette fonction est le texte à écrire dans la variable précédemment citée. Enfin, les trois petits points ne sont pas obligatoires, ce sont des paramètres optionnels. Comme pour printf, si vous mettez dans le texte le signe "%d" et, à la place des trois petits points, une variable de type int, celle ci s'affichera dans le texte. Voici un exemple pour mieux comprendre:

char variableDestination[100];
int age = 45;


/*On forme de toutes pièces la variable variableDestination*/
sprintf(variableDestination,"Vous avez %d ans.", age);
printf("%s", variableDestination);
//On affiche cette variable.

Sprintf est donc très utile pour la création de chaines de caractèresSmiley souris


Voilà, je vous ai montré les quelques fonctions relatives aux chaines de caractères qui me semblaient utiles. Si, par la suite, nous avons besoin d'autre fonctions, je vous les indiquerais et expliqueraisSmiley souris

 
Mais rien ne vous empêche d'aller de vous même voir le fichier source string.h pour voir les différentes autres chaines de caractères (attention toutefois ce fichier ne contient que les prototypes de ces fonctions et non le code des fonctions à part entièreSmiley souris)

Le prochain chapitre traitera des pointeurs et de la gestion des adressesSmiley souris
Ce ne sera pas le moment de dormir car il s'agit peut être d'un des chapitres les plus dur mais ne vous en faites pas, vous avez fais le pire si vous êtes arrivé jusqu'iciSmiley rigole

                               
   Les tableaux                                                     Les pointeurs et la gestion des adresses







 
 
 



Créer un site
Créer un site