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];    // this will cause an access violation
  // statements
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;   // empty string
begin
  proc(PChar(S));  // be sure that proc can handle nil
  // statements
end;

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

S := 'No longer nil';
proc(PChar(S));// proc does not need to handle nil now

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

SetLength(S, 100);//sets the dynamic length of S to 100 characters
proc(PChar(S));// proc does not need to handle nil now

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('Unicode string');

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