Construire de nouvelles chaînes
Vala supporte un certain nombre d'opérations usuelles sur les chaînes. La première, appelée
concaténation, permet d'acoller deux chaînes, et utilise l'opérateur + :
Code : Vala | string alpha = "Bonjour";
string beta = " les Zéros !";
stdout.puts(alpha + beta); // Affichera "Bonjour les Zéros !"
|
Les chaînes sont des objets comme les autres en Vala. Cela veut dire qu'elles possèdent des
méthodes. Nous avons déjà vu ce mot plusieurs fois : il désigne du code possédé par un objet, qui permet bien souvent d'agir sur lui. Par exemple,
stdout désigne la sortie standard, c'est à dire l'écran dans la plupart des cas, et
printf permet d'écrire sur cette sortie.
Il existe également une méthode
printf pour les chaînes ! Son rôle est à peu près le même que celle de
stdout, sauf qu'elle renvoie une nouvelle chaîne à partir de la chaîne sur laquelle on l'applique plutôt que d'écrire à l'écran. Par exemple,
Code : Vala | string format = "Bonjour %s, tu as %d ans.";
string format2 = format.printf("Gérard", 4);
stdout.puts(format2);
stdout.puts(format); // La chaîne initiale n'est pas modifiée !
|
Notez bien que l'on a du stocker le résultat dans une chaîne. On aurait pu réutiliser la même, mais il faut en tout cas bien retenir qu'elle n'est pas modifiée sans réutiliser le symbole = de l'affectation.
Comparaison de chaînes
Il est possible de comparer facilement les chaînes en Vala. Par exemple, contrairement aux langages C ou Java, on peut utiliser l'opérateur == pour tester l'égalité !
Code : Vala | string mot_de_passe = "Chapter24";
string entree;
stdout.printf("Entrez le mot de passe :\n");
entree = stdin.read_line();
if (entree == mot_de_passe)
stdout.printf("Vous avez deviné !");
else
stdout.printf("Ah non, raté !");
|
De même, on peut utiliser la construction
switch
avec les chaînes. Essayez de réécrire l'exemple précédent avec celle-ci (n'hésitez pas à regarder à nouveau le chapitre précédent).
Enfin, il est possible de comparer les chaînes dans l'ordre
lexicographique, qui n'est rien d'autre que l'ordre du dictionnaire. Par exemple,
"abeille" < "balançoire"
est vrai.
Sous-chaînes
À partir d'une chaîne, on peut extraire une
sous-chaîne, qui est composée des caractères de la chaîne initiale compris entre deux positions. Autrement dit, de la chaîne
"Bonjour les Zéros !"
, on peut par exemple extraire la chaîne "Zéros" (ou n'importe quelle autre). Pour ce faire, on utilise la méthode
substring.
Code : Vala | string chaine = "Bonjour les Zéros !";
string extraction;
extraction = chaine.substring(12, 5);
stdout.printf("Vous êtes des " + extraction + ".");
|
Comme le montre cet exemple,
substring prend en arguments la position initiale de la sous-chaîne, et la longueur que l'on veut extraire.
Il est également possible de tester la présence d'une chaîne dans une autre, à l'aide de la méthode
contains ou de l'opérateur
in
:
Code : Vala | string chaine = "Cette leçon vaut bien un fromage sans doute";
if (chaine.contains("leçon"))
stdout.printf("C'est vrai.\n");
if ("fromage" in chaine)
stdout.printf("C'est vrai aussi.");
|
En vrac
Vala supporte en outre quelques autres opérations sur les chaînes. On peut les mettre en majuscule à l'aide de la méthode
up, ou en minuscule à l'aide de la méthode
down. On peut également les renverser (le premier caractère devient le dernier, et ainsi de suite) à l'aide de la méthode
reverse. Et, pourquoi pas, éliminer les espaces placés au début et à la fin d'une chaîne à l'aide de la méthode
strip. Essayez-les !
Il y en a d'autres encore, mais nous ne pouvons pas toutes les citer. À vous de les découvrir, au fur et à mesure de votre apprentissage de Vala.
Il nous reste encore à parler de la
longueur et de la
taille d'une chaîne. La première se définit comme le nombre de caractères de la chaîne. La seconde est la taille que la chaîne prend en mémoire. Attention, ces deux grandeur ne sont pas souvent égales ! C'est du au fait que certains caractères Unicode, notamment les caractères accentués, prennent plusieurs octets en mémoire.
La documentation officielle de Vala donne l'exemple suivant :
Code : Vala | string dessert = "crème brûlée";
stdout.printf ("La chaîne '%s' comporte %d caractères, et prend %d octets en mémoire.\n",
dessert, (int) dessert.length, (int) dessert.size ())
|
En l'essayant, vous constaterez que la longueur et la taille diffèrent. Notez que la première est donnée par
dessert.length, alors que la seconde est donnée par
dessert.size() : dans le second cas, on trouve des parenthèses parce que
size est une méthode tout ce qu'il y a de plus classique. Au contraire,
length est une
propriété : c'est une caractéristique d'un objet qui n'est pas exécutable, contrairement à une méthode. C'est juste une donnée appartenant à l'objet, et on l'utilise avec son nom, sans parenthèses.
Dernière remarque,
dessert.length est de type
long
: pour l'afficher ici, nous avons du le convertir en
int
. Encore plus fou,
dessert.size() est d'un type qui ne nous intéresse pas trop pour l'instant, à savoir le type
size_t
, et nous avons du lui aussi le convertir.
Sans faire de conversion, il est possible d'afficher des données de type
long
et
size_t
en remplaçant
%d par respectivement
%ld et
%Zd.
Ceci aura son importance quand nous manipulerons de très grands nombres, que le type
int
ne peut pas accueillir. Essayez donc de retenir
%ld, car si au pire vous oubliez l'autre vous pourrez toujours convertir la donnée en
long
.