IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

Découpage d'une chaîne de type PChar


Sujet :

Langage Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut Découpage d'une chaîne de type PChar
    Bonjour !

    J'ai trouvé une fonction (dans l'unité WinDos de Virtual Pascal) qui renvoie la valeur d'une variable d'environnement, sous la forme d'un pointeur de type PChar. Pour le plaisir de l'exercice, je voulais voir si j'arriverais à découper la chaîne sans la convertir en string. Eh bien, je ne vois pas trop comment faire, et je serais curieux de savoir comment vous vous y prendriez (à moins que la chose ne présente vraiment aucun intérêt).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    (* Virtual Pascal *)
     
    program Path;
    {&PMTYPE VIO}
     
    uses
      WinDos;
     
    var
      p: pChar;
     
    begin
      p := GetEnvVar('PATH');
      WriteLn(p);
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    pour un string tu utiliserais probablement une boucle for i:= 1 to Length(Str)do begin if Str[i] ...; end;.
    avec un PChar tu utiliseras while p^<>#0 do begin if p^...; Inc(p); end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    Merci Paul ! Voici ce que j'ai fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    program Path2;
    {&PMTYPE VIO}
     
    uses
      WinDos;
     
    var
      p: pChar;
     
    begin
      p := GetEnvVar('PATH');
      while p^ <> #0 do
      begin
        Write(p^);
        if p^ = ';' then
          WriteLn;
        Inc(p);
      end;
      WriteLn;
      Write('Appuyez sur ENTREE... ');
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 058
    Points : 15 339
    Points
    15 339
    Billets dans le blog
    9
    Par défaut
    En regardant le code source d'un programme de conversion de fichiers *.H en unités Pascal, je suis tombé sur des fonctions que j'ai trouvées bien faites, et qui traitent le problème qui est le sujet de cette discussion. Je les ai mises dans une unité séparée, et j'ai écrit un petit programme pour les essayer, toujours avec le contenu de ma variable PATH.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    { Affiche ligne par ligne le contenu de la variable d'environnement PATH.
      Virtual Pascal 2.1.
    }
     
    program GetPath;
    {$PMTYPE VIO}
     
    uses
      Utils,  { WordCount, ExtractWord }
      WinDOS; { GetEnvVar }
     
    const
      MAX_PATH = 260;
     
    var
      delims: pChar = ';';
      path: pChar;
      c: array[0..MAX_PATH]of char;
      i, n: integer;
     
    begin
      path := GetEnvVar('PATH');
     
      n := WordCount(path, delims);
     
      for i := 1 to n do
        WriteLn(ExtractWord(c, path, delims, i));
     
      WriteLn(StringOfChar('-', 20));
     
      Write('Appuyez sur la touche Entr'#130'e... ');
      ReadLn;
    end.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    unit Utils;
     
    { Fonctions extraites du programme H2Pas de Peter Sawatzki.
      http://www.sawatzki.de/download.htm
    }
     
    interface
     
    function WordCount(aStr, Delims: pChar): integer;
    function WordPosition(aStr, Delims: pChar; No: integer): pChar;
    function ExtractWord(aDst, aStr, Delims: pChar; No: integer): pChar;
    function Trim(aDst, aSrc: pChar): pChar;
    function Pad(aDst, aSrc: pChar; Count: integer): pChar;
    function StrIPos(Str1, Str2: pChar): pChar;
     
    implementation
     
    uses
      Strings;
     
    function WordCount(aStr, Delims: pChar): integer;
    var
      EndStr: pChar;
    begin
      EndStr := StrEnd(aStr);
      result := 0;
      while aStr <= EndStr do
      begin
        while (aStr <= EndStr) and (StrScan(Delims, aStr[0]) <> nil) do
          Inc(aStr);
        if aStr <= EndStr then
          Inc(result);
        while (aStr <= EndStr) and (StrScan(Delims, aStr[0]) = nil) do
          Inc(aStr);
      end;
    end;
     
    function WordPosition(aStr, Delims: pChar; No: integer): pChar;
    var
      Count: integer;
      EndStr: pChar;
    begin
      EndStr := StrEnd(aStr);
      Count:= 0;
      result := nil;
      while (aStr <= EndStr) and (Count <> No) do
      begin
        while (aStr <= EndStr) and (StrScan(Delims, aStr[0]) <> nil) do
          Inc(aStr);
        if aStr <= EndStr then
          Inc(Count);
        if Count <> No then
          while (aStr <= EndStr) and (StrScan(Delims, aStr[0]) = nil) do
            Inc(aStr)
        else
          result := aStr
      end;
    end;
     
    function ExtractWord(aDst, aStr, Delims: pChar; No: integer): pChar;
    var
      EndStr: pChar;
    begin
      result := aDst;
      aStr := WordPosition(aStr, Delims, No);
      if Assigned(aStr) then
      begin
        EndStr := StrEnd(aStr);
        while (aStr <= EndStr) and (StrScan(Delims, aStr[0]) = nil) do
        begin
          aDst[0] := aStr[0];
          Inc(aStr);
          Inc(aDst)
        end
      end;
      aDst[0] := #0
    end;
     
    function Trim(aDst, aSrc: pChar): pChar;
    var
      EndStr: pChar;
    begin
      result := aDst;
      if not Assigned(aSrc) or (aSrc[0] = #0) then
        aDst[0] := #0
      else
      begin
        EndStr := StrEnd(aSrc);
        while (aSrc < EndStr) and (aSrc[0] <= ' ') do
          Inc(aSrc);
        StrCopy(aDst, aSrc);
        EndStr := StrEnd(aDst);
        while (EndStr > aDst) and (EndStr[0] <= ' ') do
        begin
          EndStr[0] := #0;
          Dec(EndStr)
        end
      end
    end;
     
    function Pad(aDst, aSrc: pChar; Count: integer): pChar;
    begin
      result := aDst;
      if aDst <> aSrc then
        StrCopy(aDst, aSrc);
      Count := Count - StrLen(aDst);
      aDst := StrEnd(aDst);
      while Count > 0 do
      begin
        aDst[0] := ' ';
        Inc(aDst);
        Dec(Count)
      end;
      aDst[0] := #0
    end;
     
    function StrIPos(Str1, Str2: pChar): pChar;
    var
      EndStr: pChar;
      Len: integer;
    begin
      result := nil;
      EndStr := StrEnd(Str1);
      Len:= StrLen(Str2);
      repeat
        Str1 := StrScan(Str1, Str2[0]);
        if Str1 = nil then
          exit;
        if StrLIComp(Str1, Str2, Len) = 0 then
        begin
          result := Str1;
          exit;
        end;
        Inc(Str1)
      until Str1 > EndStr;
    end;
     
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Découpage d'une chaîne
    Par bremer dans le forum Langage
    Réponses: 18
    Dernier message: 28/01/2008, 20h20
  2. Réponses: 6
    Dernier message: 05/01/2008, 18h19
  3. Réponses: 3
    Dernier message: 01/08/2007, 12h49
  4. Découpage d'une chaîne de caractères
    Par karinhalabi dans le forum Cobol
    Réponses: 1
    Dernier message: 11/04/2007, 17h22
  5. Découpage d'une chaîne de caractère
    Par turbo_chess dans le forum C
    Réponses: 1
    Dernier message: 01/04/2007, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo