| 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\" " ;
|
|
| auteur : Geronimo |
Pour convertir une chaîne AnsiString en majuscules, utilisez la méthode UpperCase.
AnsiString Chaine;
Chaine = " coucou " ;
Chaine = Chaine.UpperCase ();
ShowMessage (Chaine);
|
|
| auteur : Geronimo |
Afin de convertir une chaîne AnsiString en minuscules, utilisez la méthode LowerCase.
AnsiString Chaine;
Chaine = " COUCOU " ;
Chaine = Chaine.LowerCase ();
ShowMessage (chaîne);
|
|
| 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;
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;
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 ();
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 ];
char * pDest = new char [Dest.Length ()+ 1 ];
strcpy (pSrc,Src.c_str ());
strcpy (pDest,Dest.c_str ());
CopyFile (pSrc,pDest,true );
delete [] pSrc;
delete [] pDest;
|
|
| 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 " );
}
}
|
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.
|
| 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 " );
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.
|
| 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 : Comment obtenir une AnsiString à partir de sa représentation hexadécimale ?
|
| 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 : Comment obtenir la représentation hexadécimale d'une AnsiString ?
|
| 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 ];
|
|
lien : Comment connaître la longueur d'une chaîne de caractères ?
|
| 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 (" . " );
|
|
lien : Comment remplacer une occurrence dans une chaîne par une autre valeur ?
|
| 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 :
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 " );
|
|
lien : Comment déterminer la position d'une occurrence à l'intérieur d'une chaîne ?
|
| 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 :
{
break ;
}
case 1 :
{
break ;
}
case 2 :
{
break ;
}
case - 1 :
{
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.
|
|