Informationen zur Klasse Strings
// Name: Strings1.cpp // Inhalt: Arbeiten mit der Klasse Strings // --------------------------------------------------------------------- #include <iostream> #include <string> using namespace std; int main() {int len,pos; string s1="123"; // String s1 wird über die Klasse string definiert char s2[20]="456"; // String s2 wird als Array von char definiert cout << s1 << s2 << endl; len = s1.length(); // liefert 3, die Laenge des Strings cout << len << endl; s1.insert(2, "xy"); // s ist nun "12xy3" cout << s1 << endl; s1.erase(2,2); // s ist nun "123" cout << s1 << endl; pos = s1.find("23"); // liefert die Position 1 cout << pos << endl; fflush(stdin); getchar(); // nur wegen Windowsumgebung return 0; }
AnsiStrings sind eine spezielle Stringklasse die unter Turbo C++ verwendet wird.
Viele Eigenschaften der Komponenten in der VCL speichern Strings, wie z. B. die Eigenschaften Text, Caption und Name. Diese Zeichenketten werden allerdings nicht im C-typischen Format mit abschließender Null, sondern in dem String-Format von Object Pascal gespeichert. In C++ wurde dazu die Klasse Ansistring erzeugt, die diese Zeichenketten speichert. Statt Ansistring kann auch kurz String verwendet werden.
Die Klasse Ansistring besitzt einige Vorteile gegenüber den üblichen C-Strings. So wird in der Klasse immer überprüft, dass nie auf ungültige Speicherbereiche zugegriffen wird, und es stehen verschiedene Methoden zur Arbeit mit den gespeicherten Zeichenketten zur Verfügung (Konvertierung nach int, in Klein-/Großbuch-staben…). Grundsätzlich hat die Klasse Ansistring zwei Nachteile gegenüber den C-Zeichenketten.
Ansistring S; // eine Instanz S wird erzeugt S = 100; // für die Zahl 100 wird der Konstruktor der Klasse Ansistring // aufgerufen, der eine Zahl als Argument entgegennimmt int i = S.ToInt(); // ein Ansistring wird in eine Zahl konvertiert ShowMessage(12.345); // Konstruktor für double wird aufgerufen
Die Klasse AnsiString bietet verschiedene Konstruktoren, die teilweise automatisch aufgerufen werden, z.B. wenn einem AnsiString eine Zahl zugewiesen wird wie im obigen Beispiel. Den Konstruktoren können beispielsweise int-, double-, char*-, AnsiString- und char-Werte übergeben werden. Ein Konstruktoraufruf ohne Parameter erzeugt einen AnsiString der Länge 0.
In der Klasse Ansistring wurden zahlreiche Operatoren überladen, wie z. B. +, ==, =, > und <. So ist eine einfache Anwendung von AnsiStrings möglich.
| Methode | Beschreibung | Beispiel |
|---|---|---|
c_str | Konvertiert einen AnsiString in einen C-String (char*). Dies wird häufig in Funktionen des Windows-API benötigt, da diese Funktionen keine AnsiStrings verwenden können. | char cStr [100];String S = „TEST“;strcpy(cStr,S.c_str()); |
IsEmpty | Testet, ob der String leer ist | if (S.Empty()) … |
Length | Liefert die Länge zurück | int Len = S.Length(); |
LowerCase | Wandelt einen AnsiString in Kleinbuchstaben um | String S2 = S.LowerCase(); |
ToDouble | Konvertiert einen AnsiString in einen double-Wert | double d = S.ToDouble(); |
ToInt | Konvertiert einen AnsiString in einen int-Wert | int i = S.ToInt(); |
UpperCase | Wandelt einen AnsiString in Großbuchstaben um | String S2 = S.UpperCase(); |
CurrToStrDateToStr | Konvertierungsfunktionen von Währungen oder Datum nach AnsiString | String S = DateToStr(Date()); |
Wenn Sie Funktionen entwickeln, die AnsiStrings als Parameter erwarten, verwenden Sie für die Parameterübergabe Referenzen oder Zeiger. Ansonsten wird bei jedem Aufruf der Funktion der Kopierkonstruktor aufgerufen, was einen zusätzlichen Aufwand bewirkt.
Teilstring ermitteln
AnsiString MidStr (AnsiString AText, int AStart, int ACount);
Beschreibung:
Position eines Teilstrings ermitteln
int PosEx (AnsiString SubStr, AnsiString S, int Offset);
Beschreibung:
Beispiel: Projekt Ansistring.bpr
Das folgende Programm zeigt den Einsatz einiger Methoden der Klasse AnsiString:
| Komponente | Eigenschaft | Wert |
|---|---|---|
| • Formular | Name | frmMain |
| Caption | AnsiStrings | |
| • Button | Name | btnStart |
| Caption | Start | |
| • Edit | Name | edtlnt |
| Text | [leer] | |
| • Edit | Name | edtNura |
| Text | [leer] |
void__fastcall TfrmMain::btnStartClick(TObject *Sender) {String Meldung = "DIES IST EINE NACHRICHT"; // (1) String Titel = "ACHTUNG"; // (2) double d; int i; edtInt->Text = 100; // (3) edtNum->Text = 232.12; // (4) i = edtInt->Text.Tolnt(); // (5) d = edtNum->Text.ToDouble(); // (6) MessageBox(this->Handle, Meldung.c_str(), Titel.c_str(), MB_OK); // (7) }