FAQ PascalConsultez toutes les FAQ

Nombre d'auteurs : 10, nombre de questions : 401, dernière mise à jour : 5 novembre 2017  Ajouter une question

 

Bienvenue dans la F.A.Q. Pascal !

Celle-ci rassemble les réponses aux questions les plus fréquemment posées sur le langage Pascal et tous ses outils de programmation. Si elle n'a pas pour vocation de répondre à toutes les interrogations possibles, elle reste une bonne base de connaissances sur le Pascal, et ne demande qu'à être enrichie par vos expériences personnelles.

Nous vous invitons à proposer vos propres questions/réponses directement dans la FAQ ou, si vous souhaitez apporter une modification à une question/réponse existante, à la poster dans le fil de discussion renseigné ci-dessous.

Nous vous souhaitons une bonne lecture !

L'équipe Pascal.

Commentez


SommaireLe langage PascalLes chaînes de caractères à zéro terminal (12)
précédent sommaire suivant
 

Une chaîne AZT est un tableau de caractères terminé par 0. Le 0 terminal est le caractère #0 (dont le code ANSI vaut 0), à ne pas confondre avec le caractère '0' (dont le code ANSI vaut 48) !
Voici la représentation d'une chaîne AZT en mémoire :

Code : Sélectionner tout
1
2
 
|'B'|'o'|'n'|'j'|'o'|'u'|'r'| 0 |
Théoriquement, une chaîne AZT n'a aucune limitation de taille, si ce n'est celle de la mémoire du système. Sa déclaration est celle d'un tableau de caractères :

Code delphi : Sélectionner tout
1
2
  
Var Chaine : Array [0..10] of Char;
La variable Chaine permet de stocker 10 caractères + le zéro terminal.

En C, il n'y a aucune différence entre un tableau en mémoire et un pointeur vers ce tableau. En Pascal, si ! Sauf pour les chaînes AZT. Un type particulier de pointeur, pChar, permet l'adressage des chaînes AZT et le passage de chaînes AZT comme paramètres aux procédures et fonctions.

  • Tableau de caractères et pointeur sur un tableau de caractères sont équivalents.

Il est donc tout à fait correct d'écrire les deux instructions suivantes :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
  
Var Chaine : Array [0..10] of Char; 
    pChaine : pChar; 
Begin 
  (* Les 2 instructions suivantes font la même chose : *) 
  pChaine := Chaine; 
  pChaine := @Chaine; 
End.
Quelques illustrations de l'équivalence entre tableau de caractères et pointeur pChar :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
  
Var Chaine : Array [0..10] of Char; 
    pChaine : pChar; 
    Caractere : Char; 
Begin 
  pChaine := Chaine; 
  (* Les 2 instructions suivantes font la même chose : *) 
  Caractere := Chaine[6]; 
  Caractere := pChaine[6]; 
End.
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  
Var Chaine : Array [0..10] of Char; 
    pChaine : pChar; 
  
Procedure Traitement (p : pChar); 
Begin 
  { . . . } 
End;   
  
Begin 
  pChaine := Chaine; 
  (* Les 2 instructions suivantes font la même chose : *) 
  Traitement(Chaine); 
  Traitement(pChaine); 
End.
  • Les constantes tableaux de caractères sont elles aussi équivalentes aux pointeurs pChar;
  • Les paramètres de type chaîne AZT sont passés aux procédures et fonctions par adresse.

Il est possible de passer une constante tableau de caractères comme paramètre à une procédure :

Code delphi : Sélectionner tout
1
2
  
Traitement('hello');
Cette dernière instruction stocke la chaîne de caractères dans le segment de données du programme et passe son adresse à la procédure Traitement.
Il se passe exactement la même chose lorsqu'on assigne une constante tableau de caractères à un pointeur pChar :

Code delphi : Sélectionner tout
1
2
  
pChaine := 'hello';
La chaîne est stockée dans le segment de données et son adresse est affectée à pChaine. La chaîne n'est donc aucunement recopiée.

Pour pouvoir utiliser les chaînes AZT, vous devez déclarer l'unité Strings dans la clause Uses de votre programme.

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

Il est possible de convertir une chaîne AZT en String à l'aide de la fonction StrPas :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
  
Program CONVERS1; 
  
Uses Strings; 
  
Var s : String [7]; 
    c : Array [0..7] of Char; 
  
Begin 
  StrCopy(c,'Bonjour'); 
  s := StrPas(c); 
End.
La conversion inverse se fait avec la fonction StrPCopy :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
  
Program CONVERS2; 
  
Uses Strings; 
  
Var s : String [7]; 
    c : Array [0..7] of Char; 
  
Begin 
  s := 'Bonjour'; 
  StrPCopy(c,s); 
End.

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

Pour assigner une valeur à une chaîne AZT, on utilise la fonction StrCopy :

Code delphi : Sélectionner tout
1
2
  
StrCopy(Chaine,'Bonjour');
Physiquement, la chaîne « Bonjour » est copiée dans la chaîne AZT. Il y a donc bien deux exemplaires de la chaîne à l'arrivée !

Attention : il peut être tentant, par analogie avec les Strings, d'assigner une valeur à une chaîne AZT comme ceci :

Code delphi : Sélectionner tout
1
2
3
4
  
Var Chaine : Array [0..7] of Char; 
  
Chaine := 'Bonjour';   (* Erreur de syntaxe ! *)
Mais le compilateur rejettera cette syntaxe ! Il faut employer StrCopy.

Mis à jour le 18 février 2007 Alcatîz

Pour initialiser une chaîne vide, c'est tout simple : il suffit qu'elle commence par le zéro terminal !

Code delphi : Sélectionner tout
1
2
  
Chaine[0] := #0;

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

On peut tronquer une chaîne en y insérant un zéro terminal :

Code delphi : Sélectionner tout
1
2
  
Chaine[5] := #0;

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

Pour déterminer la longueur d'une chaîne AZT, on utilise la fonction StrLen :

Code delphi : Sélectionner tout
1
2
  
Longueur := StrLen(Chaine);
Cette fonction compte les caractères de la chaîne jusqu'au zéro terminal.

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

StrCopy sert également à copier une chaîne 1 dans une chaîne 2 :

Code delphi : Sélectionner tout
1
2
  
StrCopy(Chaine2,Chaine1);
Attention à l'ordre des paramètres : destination avant source !

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

Pour comparer deux chaînes AZT, vous avez le choix entre StrComp (qui tient compte des majuscules et minuscules) et StrIComp (qui n'en tient pas compte). La valeur retournée par ces deux fonctions peut être positive, négative ou nulle :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  
Var Chaine1 : Array [0..40] of Char; 
    Chaine2 : Array [0..30] of Char; 
    Resultat : Integer; 
  
Resultat := StrIComp(Chaine1,Chaine2); 
if Resultat > 0 
   then 
     WriteLn('Chaine1 > Chaine2') 
   else 
     if Resultat < 0 
        then 
          WriteLn('Chaine1 < Chaine2') 
        else 
          WriteLn('Chaine1 = Chaine2');

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

Pour déterminer la position d'une chaîne dans une autre, on utilise StrPos. Alors que la fonction Pos (pour les chaînes de type String) renvoie un indice, la fonction StrPos retourne un pointeur pChar.

Exemple :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  
Program POSITION; 
  
Uses WinCRT,Strings; 
  
Var Chaine : Array [0..40] of Char; 
    Extrait : Array [0..15] of Char; 
    Adresse : pChar; 
  
Begin 
  StrCopy(Chaine,'Salut la compagnie !'); 
  StrCopy(Extrait,'compagnie'); 
  Adresse := StrPos(Chaine,Extrait); 
  WriteLn(Adresse); 
  WriteLn('Indice de l''extrait : ',Adresse - Chaine); 
End.
Tout d'abord, la variable Adresse retournée par l'instruction

Code delphi : Sélectionner tout
1
2
  
Adresse := StrPos(Chaine,Extrait);
porte bien son nom puisqu'elle contient l'adresse de la chaîne 'compagnie' dans la chaîne 'Salut la compagnie !'. Pour bien le prouver, l'instruction

Code delphi : Sélectionner tout
1
2
  
WriteLn(Adresse);
affiche à l'écran : compagnie !, c'est-à-dire à partir de l'adresse Adresse jusqu'au zéro terminal.

Enfin, la dernière instruction soustrait l'adresse de la chaîne de départ à l'adresse trouvée par StrPos pour donner l'indice de l'extrait. L'indice du 1er caractère étant 0 et non 1 comme pour les chaînes à attribut de longueur, l'indice affiché est bien 9 et non 10.

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

Pour concaténer deux chaînes AZT, il existe l'instruction StrCat :

Code delphi : Sélectionner tout
1
2
3
4
5
  
Var Chaine1 : Array [0..40] of Char; 
    Chaine2 : Array [0..30] of Char; 
  
StrCat(Chaine1,Chaine2);   { Ajoute Chaine2 à Chaine1 }
Que se passe-t-il si le contenu des deux chaînes mises bout à bout dépasse la taille limite de Chaine1 ? Un beau plantage !

La fonction StrCat n'effectue aucune vérification de débordement !

Une précaution peut être de choisir la fonction StrLCat :

Code delphi : Sélectionner tout
1
2
3
4
5
  
Var Chaine1 : Array [0..40] of Char; 
    Chaine2 : Array [0..30] of Char; 
  
StrLCat(Chaine1,Chaine2,SizeOf(Chaine1) - 1);
Traduite en langage courant, cette instruction signifie : « ajouter à Chaine1 le contenu de Chaine2 en veillant à ne pas dépasser la taille maximale de Chaine1 ».

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

La fonction StrNew permet d'allouer une chaîne AZT dans le tas :

Code delphi : Sélectionner tout
1
2
3
4
  
Var p : pChar; 
  
p := StrNew('Allocation dans le tas');
Cette instruction alloue l'espace nécessaire dans le tas, y copie la chaîne et retourne l'adresse du bloc alloué. Il y a donc deux copies de la chaîne : une dans le segment de données et l'autre dans le tas.

Le principe de l'allocation dans le tas est économe en mémoire, car n'est alloué que l'espace nécessaire pour stocker une copie de chaîne avec le zéro terminal :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
  
Var Chaine : Array [0..255] of Char; 
    p : pChar; 
  
Begin 
  StrCopy(Chaine,'Allocation dans le segment de données'); 
  p := StrNew(Chaine); 
  WriteLn(p); 
  StrDispose(p); 
End.
StrNew alloue dans le tas l'espace nécessaire pour stocker non pas 255 caractères (+ le zéro terminal) mais seulement 36 caractères (+ le zéro terminal) ! Notez que si la longueur de la chaîne est nulle ou s'il n'y a plus assez de mémoire dans le tas pour allouer la chaîne, StrNew renverra Nil.

La fonction qui permet de libérer dans le tas l'espace alloué à une chaîne AZT est StrDispose.

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

Il est possible d'utiliser des chaînes AZT comme des strings si la syntaxe étendue est activée dans les options du compilateur.

Mis à jour le 18 février 2007 Alcatîz

Strings et pChar en Delphi, par Adrien Reboisson

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Pascal : Gilles Vasseur - Alcatîz -