Une chaîne de caractères est comme un tableau rempli de caractères. Une chaîne a ainsi une longueur, les caractères qui la composent sont numérotés à partir de zéro, et on peut modifier un caractère donné de la chaîne.
Mais attention, une chaîne, valeur de type string
, n'est pas traitée comme un tableau de caractères (qui serait de type char array
). C'est un choix de Caml, puisque d'autres langages assimilent textes et tableaux de caractères. Pour cette raison, il y a des fonctions et des notations spéciales pour les chaînes, qui suivent la même logique que pour les tableaux. Toutes les fonctions de manipulations des chaînes sont regroupés dans le module String
.
Il y a deux manières de créer une chaîne. La première on la connaît déjà, c'est la construction avec les guillemets :
let s = "un texte" in ...
La seconde construction se fait avec String.make
, fonction qui prend en argument deux paramètres. Le premier est la taille de la chaîne à créer, et le second est le caractère qui va servir à remplir la chaîne. Ainsi les deux déclarations suivantes sont équivalentes :
let s = String.make 10 'a' in ... let s = "aaaaaaaaaa" in ...
Comme les tableaux vides, il existe les chaînes vides, c'est-à-dire sans aucun caractères. Deux façons de faire :
let s = String.make 0 'a' in ... let s = "" in ...
Pour connaître la longueur d'une chaîne, on fait simplement : String.length
devant le nom de la chaîne.
let s = "un texte" in let t = String.length s in print_int t;
Ce code affiche 8, puisqu'il y a deux lettres pour "un"
, un pour l'espace, et 5 dans "texte"
.
Pour accéder au caractère à l'indice i
dans une chaîne nommée str
, on fait str.[i]
avec des crochets et non des parenthèses qui servent pour les tableaux. Par exemple ce code affiche "uee"
:
let s = "un texte" in print_char s.[0]; print_char s.[4]; print_char s.[7];
Pour modifier un caractère, on fait : str.[i] <- caractère
. Dans le code suivant, on part d'une chaîne "je teste"
, on modifie le 't'
qui est à l'indice 3 en un 'r'
, et on affiche le résultat qui est "je reste"
.
let s = "je teste" in s.[3] <- 'r'; print_string s;
Pour copier une chaîne, on utilise String.copy
, de la même manière que Array.copy
.
Dernière chose à savoir : on peut mettre bout à bout deux chaînes à l'aide de l'opérateur accent circonflexe. Cette opération s'appelle la "concaténation"
. Ainsi ce code concatène "début"
et "fin"
et affiche "débutfin"
:
print_string ("début" ^ "fin");
Cet opérateur n'ajoute ni espace ni retour à la ligne entre les deux chaînes. Ainsi pour rajouter un espace entre le "début"
et le "fin"
pendant notre concaténation, on fait deux concaténation de suite, afin de rajouter un espace au milieu :
print_string ("début" ^ " " ^ "fin");
ce qui permet d'afficher "début fin"
.
Résumé des manipulations de chaînes :
- Création d'une chaîne, première version :
"mon texte"
- Création d'une chaîne, seconde version :
String.make taille un_caractère
- Longueur d'une chaîne :
String.length str
- Accès à un caractère :
str.[i]
- Modification d'un caractère :
str.[i] <- nouveau_caractère
- Copie d'une chaîne :
String.copy str
. - Concaténation de deux chaînes :
str1
^str2
.
Il ne faut pas confondre les notations des chaînes et des tableaux. Exemple :
let str = "test" in print_char str.(0);
File "test.ml", line 2, characters 11-14: This expression has type string but is here used with type 'a array
Le str
est une chaîne, donc de type string
, et n'est pas un tableau de type 'a array
, comme le laisse entendre la notation avec les parenthèses.