IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Langage > Types de données > Chaînes de caractères
        Comment insérer des guillemets dans une chaîne ?
        Comment faire pour convertir une chaîne en majuscules ?
        Comment faire pour convertir une chaîne en minuscules ?
        Comment convertir une chaîne AnsiString en une chaîne C, tableau de caractères à zéro terminal ?
        Comment transformer une chaîne DOS en chaîne Windows ?
        Comment convertir une chaîne (AnsiString) en entier (int) ?
        Comment charger le contenu d'un fichier texte ?
        Comment obtenir la représentation hexadécimale d'une AnsiString ?
        Comment obtenir une AnsiString à partir de sa représentation hexadécimale ?
        Comment connaître la longueur d'une chaîne de caractères ?
        Comment accéder à un caractère d'une chaîne en connaissant sa position ?
        Comment déterminer la position d'une occurrence à l'intérieur d'une chaîne ?
        Comment remplacer une occurrence dans une chaîne par une autre valeur ?
        Comment faire un switch avec des AnsiString ?



Comment insérer des guillemets dans une chaîne ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Il faut utiliser le caractère d'échappement \ qui permet de signaler au compilateur que le caractère suivant est un caractère spécial :

AnsiString chaine = "Hello \"world\""; // La chaîne contient Hello "world"

Comment faire pour convertir une chaîne en majuscules ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Pour convertir une chaîne AnsiString en majuscules, utilisez la méthode UpperCase.

AnsiString Chaine;
Chaine = "coucou";
Chaine = Chaine.UpperCase(); // = "COUCOU"
ShowMessage(Chaine);

Comment faire pour convertir une chaîne en minuscules ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Afin de convertir une chaîne AnsiString en minuscules, utilisez la méthode LowerCase.

AnsiString Chaine;
Chaine = "COUCOU";
Chaine = Chaine.LowerCase(); // = "coucou"
ShowMessage(chaîne);

Comment convertir une chaîne AnsiString en une chaîne C, tableau de caractères à zéro terminal ?
Créé le 01/09/2004[haut]
auteurs : Geronimo, Greybird
Certaines fonctions requièrent l'usage des chaînes C standards (tableaux de caractères à zéro terminal).
La classe AnsiString fournit un grand nombre de méthodes dont la méthode c_str qui permet de convertir une AnsiString en une chaîne C (C string).

AnsiString Src;
AnsiString Dest;
//...
// Ce code va générer une erreur
CopyFile(Src, Dst, true);
Le code ci-dessus va générer une erreur "Impossible de convertir AnsiString en const char *" car la fonction CopyFile demande pour arguments des chaînes C. Pour résoudre ce problème, il convient d'utiliser la méthode c_str :

AnsiString Src;
AnsiString Dest;
//...
// Ce code ne génerera aucune erreur
CopyFile(Src.c_str(), Dst.c_str(), true);
Attention ! La méthode c_str retourne un pointeur sur une chaîne C, qui n'est valable que pour l'instruction suivant l'appel à c_str. En d'autres termes, vous ne pouvez pas faire ceci :

AnsiString Src = "Source.txt";
AnsiString Dest = "Destination.txt";
char * pSrc = Src.c_str();
char * pDest = Dest.c_str();
// instructions
CopyFile(pSrc,pDest,true);
En effet, au moment où CopyFile est exécutée, pSrc et pDest pointent sur un emplacement mémoire dont le contenu est indéfini. Il se peut très bien que la mémoire ait été écrasée entre les instructions c_str et l'appel à CopyFile. Ce ne sera pas toujours le cas, et le programme peut très bien fonctionner parfaitement pendant très longtemps, et planter de façon aléatoire...

Pour résoudre ce problème, il faut utiliser la fonction strcpy :

AnsiString Src = "Source.txt";
AnsiString Dest = "Destination.txt";
char * pSrc = new char[Src.Length()+1]; // +1 pour le 0 terminal
char * pDest = new char[Dest.Length()+1];
strcpy(pSrc,Src.c_str());
strcpy(pDest,Dest.c_str());
// instructions
CopyFile(pSrc,pDest,true);
delete[] pSrc;
delete[] pDest;

Comment transformer une chaîne DOS en chaîne Windows ?
Créé le 31/01/2005[haut]
auteurs : Nono40, Ricky81, Delphiprog
Windows fournit une fonction permettant de convertir une chaîne contenant des caractères DOS en chaîne contenant leur équivalent en caractères Windows.

AnsiString __fastcall DosStrToWinStr(const AnsiString StrDos)
{
   AnsiString Res;
   Res.SetLength(StrDos.Length());
   OemToCharBuff(StrDos.c_str(), Res.c_str(), StrDos.Length());
   return Res;
}
Pour utiliser les caractères étendus, il faut adapter la fonction aux chaînes WideString :

WideString __fastcall DosStrToWinStr(const AnsiString StrDos)
{
   WideString Res;
   Res.SetLength(StrDos.Length());
   OemToCharBuffW(StrDos.c_str(), Res.c_bstr(), StrDos.Length());
   return Res;
}
Prenons l'exemple du caractère DOS 129 "ü" qui correspond donc à la valeur 0x9a :

char a = 0x9a;
ShowMessage(a); // n'affiche pas "ü"
// les deux sorties suivantes affichent bien "ü"
ShowMessage(DosStrToWinStr(a));
ShowMessage(DosStrToWideWinStr(a));
lien : en MSDN

Comment convertir une chaîne (AnsiString) en entier (int) ?
Créé le 01/09/2004[haut]
auteurs : Geronimo, Greybird
La fonction StrToInt permet de convertir une chaîne en un entier. Il faut cependant faire attention, car la chaîne peut ne pas être convertible en entier : "Hello" ne pourra pas être convertie en entier. Une exception est déclenchée quand ce cas de figure se produit. Il faut donc rattraper cette exception pour la gérer.
Dans cet exemple, nous convertissons une valeur entrée par l'utilisateur dans une zone d'édition. Placez sur votre fiche un TEdit et un TButton. Voici le code de l'évènement OnClick du bouton :

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int i;
    try
    {
        i = StrToInt(Edit1->Text);
    }
    catch(EConvertError &Exception)
    {
        ShowMessage("Veuillez entrer un entier relatif correct");
    }
    // Utilisation de i...
}
Si jamais le contenu de la zone d'édition n'est pas convertible en entier, un message prévient l'utilisateur qu'il doit rentrer un entier correct.

A noter qu'il existe une fonction ne générant pas d'exception, mais retournant une valeur par défaut si la conversion n'est pas possible : IntToStrDef. Cette fonction peut-être utile pour certains cas de figure.


Comment charger le contenu d'un fichier texte ?
Mise à jour le 25/04/2005[haut]
auteur : Geronimo
Pour cela, on peut facilement utiliser la méthode de chargement LoadFromFile proposée par TStringList :

TStringList *Liste = new TStringList;
Liste->LoadFromFile("fichier.txt");
// traitements
delete Liste;
Le fichier est chargé en mémoire dans l'objet de type TStringList et est accessible dans son intégralité via la propriété Text mais également ligne par ligne via la propriété Strings.
Les modifications après lecture ne se font qu'en mémoire, elles ne sont pas automatiquement répercutées sur le fichier.


Comment obtenir la représentation hexadécimale d'une AnsiString ?
Créé le 31/01/2005[haut]
auteur : Greybird
La fonction suivante permettra, à partir d'une AnsiString, d'obtenir sa représentation hexadécimale, dans une AnsiString.

AnsiString ASCII2HEX(AnsiString ASCII)
{
   AnsiString HEX = "";
   try
   {
      int nbchar = ASCII.Length();
      for (int i = 1 ; i <= nbchar ; i++)
      {
         unsigned char c = ASCII[i];
         HEX = HEX + IntToHex(c,2);
      }
   }
   catch (EConvertError &e)
   {
      HEX = "";
   }
   return HEX;
}
Vous pourrez ensuite l'utiliser de la façon suivante :

AnsiString HEX = ASCII2HEX("www.developpez.com");
HEX contiendra alors "7777772E646576656C6F7070657A2E636F6D".

lien : faq Comment obtenir une AnsiString à partir de sa représentation hexadécimale ?

Comment obtenir une AnsiString à partir de sa représentation hexadécimale ?
Créé le 31/01/2005[haut]
auteur : Greybird
La fonction suivante permettra, à partir d'une AnsiString contenant la représentation hexadécimale d'une chaîne ASCII, d'obtenir cette dernière.
La chaîne ne devra contenir que des caractères valides en hexadécimal (0-9, A-F, a-f).

AnsiString HEX2ASCII(AnsiString HEX)
{
   int nbchar = HEX.Length() / 2;
   AnsiString ASCII = AnsiString::StringOfChar(' ',nbchar);
   AnsiString ASCII = AnsiString::StringOfChar(' ',HEX.Length() / 2);
   try
   {
      for (int i = 1 ; i <= nbchar ; i++)
      {
         AnsiString sHex = HEX.SubString(2*i-1,2);
         unsigned char c = StrToInt("0x" + sHex);
         ASCII[i] = c;
      }
   }
   catch (EConvertError &e)
   {
      ASCII= "";
   }
   return ASCII;
}
Vous pourrez ensuite l'utiliser de la façon suivante :

AnsiString ASCII = HEX2ASCII("7777772E646576656C6F7070657A2E636F6D");
ASCII contiendra alors "www.developpez.com".

lien : faq Comment obtenir la représentation hexadécimale d'une AnsiString ?

Comment connaître la longueur d'une chaîne de caractères ?
Créé le 31/01/2005[haut]
auteur : Ricky81
Vous pouvez utiliser la méthode Length qui renvoie le nombre de caractères qui composent une chaîne de type AnsiString.

Exemple :

AnsiString Value = "Developpez.com";
int longueur = Value.Length(); // longueur vaut 14
lien : faq Comment accéder à un caractère d'une chaîne en connaissant sa position ?

Comment accéder à un caractère d'une chaîne en connaissant sa position ?
Créé le 31/01/2005[haut]
auteur : Smortex
On peut accéder à chaque caractère d'une chaîne en indiquant entre crochets l'index du caractère que l'on souhaite récupérer.

Attention :
  • le premier caractère possède l'index 1 et non pas 0 !
  • il ne faut pas dépasser la longueur de la chaîne sous peine de violation d'accès

Exemple :

AnsiString Value = "Developpez.com";
char c = Value[1]; // c vaut 'D'
lien : faq Comment connaître la longueur d'une chaîne de caractères ?

Comment déterminer la position d'une occurrence à l'intérieur d'une chaîne ?
Créé le 31/01/2005[haut]
auteur : Ricky81
Les méthodes Pos et AnsiPos (cette dernière supporte les chaînes de caractères multi-octets) permettent de déterminer la position d'une occurrence à l'intérieur d'une chaîne de caractères. Elles retournent la position de la première occurrence si une sous-chaîne est trouvée et 0 sinon.
Il est ensuite facile d'utiliser le résultat pour traiter la sous-chaîne.

Exemple :

AnsiString Value = "Developpez.com";
int i = Value.AnsiPos("."); // i vaut 11
lien : faq Comment remplacer une occurrence dans une chaîne par une autre valeur ?

Comment remplacer une occurrence dans une chaîne par une autre valeur ?
Créé le 31/01/2005[haut]
auteurs : Ricky81, Nono40
L'unité StrUtils disponible à partir de la version 6 de C++ Builder propose les fonctions AnsiReplaceStr et AnsiReplaceText. Pour les utiliser, il vous suffit de faire l'inclusion suivante :

#include <StrUtils.hpp>
La fonction AnsiReplaceStr remplace donc toutes les occurrences d'une sous-chaîne dans une chaîne en tenant compte de la casse. AnsiReplaceText fait exactement la même chose mais est insensible à la casse.

AnsiString __fastcall AnsiReplaceStr(const AnsiString AText,
                                    const AnsiString AFromText,
                                    const AnsiString AToText);

AnsiString __fastcall AnsiReplaceText(const AnsiString AText,
                                    const AnsiString AFromText,
                                    const AnsiString AToText);
Exemple :

ShowMessage(AnsiReplaceText("Developpez.com", "com", "net"); // affiche "Developpez.net"
lien : faq Comment déterminer la position d'une occurrence à l'intérieur d'une chaîne ?

Comment faire un switch avec des AnsiString ?
Créé le 25/04/2005[haut]
auteurs : Greybird, Sjrd
L'utilisation d'un switch nécessite un type ordinal. Il est donc impossible de faire un switch avec des AnsiString. L'astuce consiste à utiliser la fonction AnsiIndexStr de l'unité StrUtils. Cette fonction prend trois paramètres :
  • la chaîne recherchée
  • un pointeur sur le tableau contenant les chaînes représentant les possibilités du switch
  • la taille de ce tableau
Le résultat est l'index de la chaîne dans le tableau si elle est trouvée, et -1 dans le cas contraire.

#include <StrUtils.hpp>
...
   AnsiString Str = "Chaine3";
   AnsiString Values[] = {"Chaine1", "Chaine2", "Chaine3"};
   int tabSize = sizeof(Values) / sizeof(AnsiString);
   switch(AnsiIndexStr(Str, &Values[0], tabSize))
   {
      case 0: // "Chaine1"
      {
         break;
      }
      case 1: // "Chaine2"
      {
         break;
      }
      case 2: // "Chaine3"
      {
         break;
      }
      case -1: // une autre chaîne
      {
         break;
      }
   }
Si votre version de C++ Builder ne propose pas cette fonction, vous pouvez l'implémenter ainsi :

int AnsiIndexStr(const AnsiString aText, const AnsiString * aTab, const int tabSize)
{
   if (aTab == NULL)
   {
      return -1;
   }
   for (int i = 0 ; i < tabSize ; i++)
   {
      if (aTab[i] == aText)
      {
         return i;
      }
   }
   return -1;
}


Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

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 © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.