Déclaration et initialisation de chaînes

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Utilisation des chaînes

Quand vous déclarez une chaîne :

S: string;

il n'est pas nécessaire de l'initialiser. Les chaînes sont automatiquement initialisées à vide. Pour tester si une chaîne longue est vide, vous pouvez utiliser la variable EmptyStr :

S = EmptyStr;

ou la comparer à une chaîne vide :

S = '';

Une chaîne vide ne contient pas de données utilisables. Donc, essayer d'accéder par indice à une chaîne vide est similaire à l'accès à nil et provoque une violation d'accès :

var
  S: string;
begin
  S[i];    // cela provoque une violation d'accès
  // instructions
end;

De même, si vous transtypez une chaîne vide en un PChar, le résultat est un pointeur nil. Donc, si vous transmettez un tel PChar à une routine qui doit le lire ou l'écrire, la routine doit gérer la valeur nil :

var
  S: string;   // chaîne vide
begin
  proc(PChar(S));  // assurez-vous que proc peut gérer nil
  // instructions
end;

Si ce n'est pas le cas, vous devez initialiser la chaîne :

S := 'plus nil';
proc(PChar(S));// proc n'a plus besoin de gérer nil

ou vous devez en spécifier la longueur en utilisant la procédure SetLength :

SetLength(S, 100);//définit la longueur dynamique de S sur 100 caractères
proc(PChar(S));// proc n'a plus besoin de gérer nil

Quand vous utilisez SetLength, les caractères existant déjà dans la chaîne sont préservés mais le contenu de l'espace nouvellement alloué est indéterminé. Après un appel à SetLength, S référence obligatoirement une chaîne unique, c'est-à-dire une chaîne dont le compteur de références a la valeur un.

Les littéraux chaîne sont Unicode par défaut. Pour initialiser une chaîne en caractères ANSI, transtypez le littéral :

AnsiString S;
S := AnsiString('chaîne Unicode');

Pour obtenir la longueur d'une chaîne en éléments, utilisez la fonction Length. Pour les chaînes MBCS et Unicode, ce n'est pas nécessairement le nombre de caractères.

Pour obtenir la longueur d'une chaîne courte en octets, utilisez la fonction SizeOf. Pour les autres types de chaînes, multipliez Length par SizeOf. Par exemple, si S est un UnicodeString, sa longueur en octets est Length(S) * SizeOf(S).

N'oubliez pas qu'une chaîne déclarée de la manière suivante :

S: string[n];

déclare implicitement une chaîne courte, et pas une chaîne de longueur n. Pour déclarer une chaîne ayant spécifiquement la longueur n, déclarez une variable de type chaîne, puis utilisez la procédure SetLength :

S: string;
SetLength(S, n);

Voir aussi