====== Strings ======
===== Klassische Strings (Strings als Char-Arrays) =====
[[http://www.willemer.de/informatik/cpp/array.htm|Informationen zu den klassischen C-Strings]]
===== Strings mit der Klasse strings =====
[[http://www.willemer.de/informatik/cpp/string.htm|Informationen zur Klasse Strings]]
// Name: Strings1.cpp
// Inhalt: Arbeiten mit der Klasse Strings
// ---------------------------------------------------------------------
#include
#include
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;
}
==== Typumwandlungen ====
int atoi (const char * str); //konvertiert string zu integer
atol //konvertiert string zu long integer (function )
atof //konvertiert string zu double
strtol // konvertiert string zu long integer
===== AnsiStrings =====
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.
* AnsiStrings sind Objekte, sie verwenden intern Methoden und sind daher langsamer.
* AnsiStrings benötigen mehr Speicherplatz.
==== Beispiel für die Anwendung von AnsiStrings ====
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.
=== Nützliche Methoden der Klasse AnsiString ===
^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.|c''har 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();''|
|''CurrToStr''\\ ''DateToStr''|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.
\\
**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)
}
* (1) Dieser Text soll später als Meldungstext angezeigt werden. Statt AnsiString kann auch String verwendet werden.
* (2) Dieser Text soll in einer Meldungsbox als Titel angezeigt werden.
* (4) In einem Eingabefeld wird der Wert 100 angezeigt. Dabei wird zuerst der Konstruktor für AnsiStrings aufgerufen, der einen int-Wert als Parameter erwartet. Danach wird dieser AnsiString der Eigenschaft Text zugewiesen.
* (4) Es wird der Konstruktor der Klasse AnsiString aufgerufen, der einen double-Wert erwartet.
* (5) Hier wird ein AnsiString über die Methode Tolnt in einen int-Wert konvertiert.
* (6) Hier wird ein AnsiString über die Methode ToDouble in einen double-Wert konvertiert.
* (7) Die Funktion MessageBox ist eine Funktion des Windows-API. Sie erwartet als ersten und zweiten Parameter einen C-String. Deshalb müssen die beiden AnsiStrings Meldung und Titel über die Methode c str in den Typ char* konvertiert werden.
==== Konvertierungsfunktionen ====
AnsiString **FloatToStrF**(long double Value, TFloatFormat Format,int Precision, int Digits);
Hier ist Format einer der folgenden Werte:
* ffGeneral allgemeines Zahlenformat
* ffExponent Darstellung im Format „–d.ddd...E+dddd“
* ffFixed Darstellung im Festkommaformat „–ddd.ddd...“
* ffNumber Darstellung im Zahlenformat „–d,ddd,ddd.ddd...“ wie beim Format ffFixed, jedoch mit Tausender-Trennzeichen
* ffCurrency Darstellung im Währungsformat
Die Tausender-Trennzeichen und Währungsformate werden dabei aus den
Ländereinstellungen der Systemsteuerung von Windows übernommen.
Beispiele: double r = 1234.456789; int P = 6, D = 4;
AnsiString s1,s2,s3,s4;
s1=FloatToStrF(r,ffGeneral,P,D); // 1234,46
s2=FloatToStrF(r,ffExponent,P,D); // 1,23446E+3
s3=FloatToStrF(r,ffFixed,P,D); // 1234,4600
s4=FloatToStrF(r,ffNumber,P,D); // 1.234,4600