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 Delphi Discussion :

Longeur d'un string avec char NULL


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut Longeur d'un string avec char NULL
    Bonjour,

    À partir d'une fonction je capture des caractères de 0 à 255 et le retour se passe dans un string.

    dans ce string, j'ai parfois un caractère #0 et si je veux connaître la longeur exacte du string il me donne une fausse longeur.

    avec ce code la longeur est incorrecte !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     showmessage(inttostr(length(sChrStr))); // longeur inexacte si un char #0 se trouve à l'intérieur.
      for I  := 1 to length(sChrStr) do
    Ma question est comme déterminer ou convertire le string pour avoir la longeur exacte.
    Merci beaucoup pour l'aide.

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 291
    Points : 1 942
    Points
    1 942
    Par défaut
    Length donne le bon résultat, par contre si la chaine est récupéré d'un contrôle Windows comme un TEdit, elle est tronquée.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Merci pour ta réponse.
    Je récupère les chars dans un string par la fonction BlockRead puis je la passe par la fonction GetHZ.

    En debuggant je vois bien tous les charactères dans le string avec la longeur exacte, mais si je fais showmessage(inttostr(length(sChrStr))); la longeur est incorrecte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Function GetHZ(sChrStr : string): string;
    begin
    ..
    showmessage(inttostr(length(sChrStr))); longeur incorrect me renvoie la longeur jusque #0
    ..

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    J'espère que tu n'es pas en Delphi 2009 et plus !
    Avec l'unicode, c'est pas joli !
    Prèfère un RawByteString dans ce cas

    Si Delphi 3 à 2007, String peut contenir sans soucis des #0

    Comment charge tu avec BlockRead ? genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetLength(sChrStr, 1024);
    BlockRead(F, sChrStr[1], 1024);
    la longueur de sChrStr c'est 1024
    Par contre un TEdit ne pourra pas l'afficher car les API Windows, utilise le #0 comme valeur terminale !

    C'est lors d'un passage que le #0 est utilisé comme une fin de chaine

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    J'ai Delphi 2007, je charge Blockread de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    const
      Buff_Size = 4024;
    ..
    ..
     FillChar(Buf1, Buff_Size, #0);
      BlockRead(F, Buf1, SizeOf(Buf1), NumRead);
      TempStr := Buf1;

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 440
    Points
    13 440
    Par défaut
    Le problème vient de cette ligne TempStr := Buf1; qui est une copie implicite d'un chaîne à zéro terminale.
    Dans tout les cas, il faut fixer la taille de TempStr par SetLength. Ensuite tu utilises cette variable directement dans la lecture comme proposé par Shai ou tu passes par un CopyMemory sur Buf1. Dans le premier cas, il faudra faire deux appels à SetLength : le premier pour fixer la taille du buffer (Buff_Size) et le deuxième sur la taille réelle après remplissage (NumRead).

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    j'ai Delphi 2007 et RawByteString n'existe pas ...
    Oui.. le problem vient de TempStr := Buf1;
    Pour mon cas, je dois chercher dans Buf1 les chr #13#10, prendre cette longeur et defenir la taille de TempStr par SetLength... le probleme est que je voudrais renvoyer cette variable par une fonction !
    Je fais des tests.., merci beaucoup pour l'aide.

  8. #8
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    const
      Buff_Size = 4024;
    ..
    ..
     FillChar(Buf1, Buff_Size, #0);
      BlockRead(F, Buf1, SizeOf(Buf1), NumRead);
      //TempStr := Buf1;
      SetString(TempStr, Buf1, NumRead);

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Whou, super je viens de finir mes tests : la fonction SetString fonctionne à merveille.
    Je vous remercie pour l'aide et bonne soirée.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/04/2010, 21h34
  2. [DOM] Document XML au format String avec encodage char spéc. xml
    Par kij dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 23/10/2008, 15h04
  3. Débutant : Pb avec string et char
    Par SebRs dans le forum C++
    Réponses: 2
    Dernier message: 04/04/2006, 09h35
  4. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54

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