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
- 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 ?
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"
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); |
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); |
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); |
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); |
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); |
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; |
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; } |
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; } |
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)); |
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... } |
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.
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; |
Les modifications après lecture ne se font qu'en mémoire, elles ne sont pas automatiquement répercutées sur le fichier.
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; } |
Code c++ : | Sélectionner tout |
AnsiString HEX = ASCII2HEX("www.developpez.com");
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; } |
Code c++ : | Sélectionner tout |
AnsiString ASCII = HEX2ASCII("7777772E646576656C6F7070657A2E636F6D");
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 |
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' |
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 |
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>
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); |
Code c++ : | Sélectionner tout |
ShowMessage(AnsiReplaceText("Developpez.com", "com", "net"); // affiche "Developpez.net"
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; } } |
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; } |
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 çaLes 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 © 2024 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.