Déclaration et initialisation de chaînes
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);