Le type chaîne de caractères (string en anglais) n'existe pas comme type simple en langage C. Il est émulé par des tableaux de caractères.
| Déclaration. | Une variable chaîne de caractères se déclare comme tableau de caractères. On a, par exemple : char NOM [10]; pour une chaîne d'au plus neuf caractères. Nous allons voir ci-dessous pourquoi on dispose d'au plus neuf caractères et non dix comme on pourrait le penser a priori à juste titre. |
| Le problème de la longueur effective. | Comme pour tout tableau, qui est un type de données statique, on doit, d'une part, déclarer une dimension maximum et, d'autre part, indiquer la longueur effective pour connaître la fin de la chaîne de caractères. Par exemple après saisie de "Paul" on peut se retrouver avec : P a u l f 4 " & z d Lorsqu'on voudra afficher, par l'instruction (en fait la fonction) printf, il faudra bien savoir jusqu'à qu'elle lettre afficher, d'où l'importance de connaître la dimension effective du tableau. |
| Solution en C. | En langage C on termine la chaîne par le caractère nul (de numéro 0 dans le code ASCII, donc le caractère '\0'), qu'il ne faut pas confondre avec le caractère blanc. "Paul" sera donc représenté par : P a u l \0 4 " & z d |
| Conséquence. | Une chaîne de caractères de longueur 'n' n'aura donc besoin d'un tableau de 'n+1' caractères au minimum. Ceci explique la déclaration ci-dessus. |
| Affectation. | Comme c'est le cas général pour les tableaux, il n'existe pas d'affectation globale pour les chaînes de caractères. On doit donc l'émuler grâce à un programme en copiant caractère par caractère. |
| Première méthode. | Nous pouvons initialiser la chaîne de caractères NOM de l'une des façons habituelles pour les tableaux, à commencer par l'initialisation lors de la déclaration :
char NOM [10] = {'P','a','u','l','\0'}; |
| Deuxième méthode. | On peut auusi faire une affectation caractère par caractère : char NOM [10]; NOM[0] = 'P'; NOM[1] = 'a'; NOM[2] = 'u'; NOM[3] = 'l'; NOM[4] = '\0'; |
| Troisième méthode. | Nous avons déjà vu aussi une façon plus globale :char NOM [10] = "Paul"; qui possède l'avantage supplémentaire de ne pas nous faire gérer la fin de la chaîne. |
| Introduction. | Il existe heureusement des fonctions standard pour saisir et afficher globalement les chaînes de caractères. |
| Printf et scanf. | Nous avons déjà rencontré les fonctions printf et scanf avec le format %s. Le nom d'une variable chaîne de caractères ne doit pas être précédé du symbole d'adressage dans le cas de la lecture (car, comme nous le verrons plus loin, NOM correspond en fait à &NOM[0]). Il est évidemment inutile de gérer le caractère nul. On a, par exemple :
char NOM [10];
printf("Quel est votre nom ? ");
scanf("%s",NOM);
printf("Bonjour %s", NOM);
|
| Formatage. | Une constante entière placée entre `%' et `s' permet d'indiquer le nombre maximum de caractères à saisir ou à afficher. Les autres caractères éventuels sont perdus. On a, par exemple :
scanf("%9s",NOM); |
| Un inconvénient. | La fonction scanf lit une chaîne de caractères jusqu'au premier blanc rencontré, autrement dit elle lit un mot. On ne peut donc pas entrer 'Paul DUBOIS" par exemple. On peut en fait paramétrer la fonction scanf. Nous renvoyons à la documentation pour cela. |
| Introduction. | Il existe des fonctions concernant les chaînes de caractères dont les déclarations se trouvent dans le fichier en-tête "string.h", implémentant certaines fonctions que nous avons déjà vues. |
| Liste. | Les principales fonctions sont :
|
| Exemple. |
Ecrivons un programme qui demande deux mots, qui les concatène, et les affiche a l'onvers.
#include <stdio.h>
#include <strng.h>
int main (void)
{
char str1[40]={0}; /* on déclare 40 caractère pour y concaténer les 2 mots de maximum 20 lettres */
char str2[20]={0}; /* initialisation du tableau avec toutes les cases à '0' */
int cmp=0; /* un compteur */
printf("Entrez la première chaine : ");
scanf("%19s", str1);
printf("Entrez la seconde chaine : ");
scanf("%19s", str2); /* déclaré avec '20', donc max de 19 caractères */
strcat(nom1,nom2); /* concaténation des deux chaines. */
cmp = strlen(nom1); /* taille total des deux chaines concaténées */
/* str1[cmp] <=> '\n' donc on le passe : */
cmp-- ;
/* srt1[cmp] est donc maintenant la derniere lettre de la grande chaine */
for(cmp;cmp > 0; cmp--) /* boucle for décroissante, sans initialisation */
{
printf("%c", str[cmp]);
}
}
|
Cours, éxercices ou graphismes libre de droit. Un mail est souhaitable | Webmestre : Aublet Bastien (bastien.aublet@hotmail.fr)