FAQ C++ BuilderConsultez toutes les FAQ

Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010  Ajouter une question

 

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe C++ Builder de Developpez.

Commentez cette FAQ : Commentez


SommaireLangageTypes de donnéesChaînes de caractères (14)
précédent sommaire suivant
 

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 :

Code c++ : Sélectionner tout
AnsiString chaine = "Hello \"world\""; // La chaîne contient Hello "world"

Mis à jour le 1er septembre 2004 Geronimo

Pour convertir une chaîne AnsiString en majuscules, utilisez la méthode UpperCase.

Code c++ : Sélectionner tout
1
2
3
4
AnsiString Chaine; 
Chaine = "coucou"; 
Chaine = Chaine.UpperCase(); // = "COUCOU" 
ShowMessage(Chaine);

Mis à jour le 1er septembre 2004 Geronimo

Afin de convertir une chaîne AnsiString en minuscules, utilisez la méthode LowerCase.

Code c++ : Sélectionner tout
1
2
3
4
AnsiString Chaine; 
Chaine = "COUCOU"; 
Chaine = Chaine.LowerCase(); // = "coucou" 
ShowMessage(chaîne);

Mis à jour le 1er septembre 2004 Geronimo

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).

Code c++ : Sélectionner tout
1
2
3
4
5
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 :

Code c++ : Sélectionner tout
1
2
3
4
5
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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
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;

Mis à jour le 1er septembre 2004 Geronimo Greybird

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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
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 :

Code c++ : Sélectionner tout
1
2
3
4
5
char a = 0x9a; 
ShowMessage(a); // n'affiche pas "ü" 
// les deux sorties suivantes affichent bien "ü" 
ShowMessage(DosStrToWinStr(a)); 
ShowMessage(DosStrToWideWinStr(a));

Mis à jour le 31 janvier 2005 Delphiprog Nono40 Ricky81

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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
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.

Mis à jour le 1er septembre 2004 Geronimo Greybird

Pour cela, on peut facilement utiliser la méthode de chargement LoadFromFile proposée par TStringList :

Code c++ : Sélectionner tout
1
2
3
4
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.

Mis à jour le 1er septembre 2004 Geronimo

La fonction suivante permettra, à partir d'une AnsiString, d'obtenir sa représentation hexadécimale, dans une AnsiString.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 :

Code c++ : Sélectionner tout
AnsiString HEX = ASCII2HEX("www.developpez.com");
HEX contiendra alors "7777772E646576656C6F7070657A2E636F6D".

Mis à jour le 31 janvier 2005 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).

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 :

Code c++ : Sélectionner tout
AnsiString ASCII = HEX2ASCII("7777772E646576656C6F7070657A2E636F6D");
ASCII contiendra alors "www.developpez.com".

Mis à jour le 31 janvier 2005 Greybird

Vous pouvez utiliser la méthode Length qui renvoie le nombre de caractères qui composent une chaîne de type AnsiString.

Exemple :

Code c++ : Sélectionner tout
1
2
AnsiString Value = "Developpez.com"; 
int longueur = Value.Length(); // longueur vaut 14

Mis à jour le 31 janvier 2005 Ricky81

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 :

Code c++ : Sélectionner tout
1
2
AnsiString Value = "Developpez.com"; 
char c = Value[1]; // c vaut 'D'

Mis à jour le 31 janvier 2005 Smortex

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 :

Code c++ : Sélectionner tout
1
2
AnsiString Value = "Developpez.com"; 
int i = Value.AnsiPos("."); // i vaut 11

Mis à jour le 31 janvier 2005 Ricky81

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 :

Code c++ : Sélectionner tout
#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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
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 :

Code c++ : Sélectionner tout
ShowMessage(AnsiReplaceText("Developpez.com", "com", "net"); // affiche "Developpez.net"

Mis à jour le 31 janvier 2005 Nono40 Ricky81

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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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 :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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; 
}

Mis à jour le 25 avril 2005 Greybird sjrd

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 © 2020 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.