C++ Einführung
C++ Variablen im Speicher, Zeiger
C++ Texte etc.
C++ Dateien, Formatierte Ausgabe, ...
C++ OOP
Hilfe / Anhang
Downloads / Links
Partner
Fehler melden / Kontakt
Impressum
|
| Seite: [1] - Drucken |
Inhalt:
C-Style Strings: Speicherlecks vorprogrammiert?
Eins vorweg: Dieser Teil befasst sich mit einer Technik, die du nicht verwenden solltest, wenn du eine andere Möglichkeit hast! C-Style strings sind schwer zu handhaben und erfordern viel Erfahrung und Ausdauer!
Wann immer möglich solltest du "std::string" nutzen, was ich dir im nächsten Teil zeigen möchte. Intern arbeitet diese Klasse allerdings genauso mit char-Arrays...
char-Array anlegen und füllen
Ein char-Array wird genauso angelegt, wie auch ein anderes Array. Beachte, das die Längenangabe wegfallen kann, der Compiler kümmert sich dann darum:
char str1[5]="Test"; char str2[]="ohne Laengenangabe"; char str3[]={'i','n',' ','C','!','\0'};
Wenn du dich jetzt über die zu großen Längenangaben und diese "\0"-Char's wunderst, hier die Erklärung:
 | Zeichenketten werden in C(++) mit einem Nullbyte ("\0") abgeschlossen! Dies ist nötig, da die Länge des Strings sonst unbekannt wäre, und man fremden Speicher lesen/schreiben würde, was zu Programmabstürzen führen kann! |
Auch andere Funktionen, die wir noch kennen lernen, orientieren sich am Nullbyte! Man sollte also immer genug Platz haben! (Besser zu viel!)
Werte in ein char-Array einlesen
Die Eingabe mit "std::cin" hat das große Problem, das die Eingabe beim ersten Leerzeichen abbricht, alles was danach kommt bleibt im Puffer...
Dieses Verhalten kann gewollt sein, muss es aber nicht! Daher gibt es "cin.get()" (Ja, auch bei Zeichenketten! ):
char test[80]; //Groß genug? std::cin >> test; //Ja nicht zu viel eingeben! //Besser: { int i=0; do { test[i]=cin.get(); }while(test[i++] != '\n' && i<=80); test[i-1] = '\0'; } //"i" wieder frei...
Die nächste Variante ist besser:
char ch_test[80]; std::cin.get(ch_test, 80); //Dritter Parameter ist //standartmäßig "newline", //also RETURN. Daher kann //man ihn hier weglassen. //oder: std::cin.getline(ch_test, 80);
char-Arrays ausgeben
Um ein char-Array auszugeben, reicht es, "std::cout" die Addresse des Startwertes zu übergeben! Dadurch wird nicht die Addresse, sondern der komplette C-String bis zum nächsten Nullbyte ausgegeben.
//Ganzen string: std::cout << test; //Teile: std::cout << test[i];
Natürlich kann man auch mit einer Schleife und "std::cin.put(test[i]);" arbeiten!
char-Arrays bearbeiten
Es gibt ein paar Funktionen im C++-Standard, die C-strings bearbeiten:
| int strcmp(str1,str2) | Strings "str1" und "str2" vergleichen und lexikographische Differenz (z.B.: alphabetisch) zurückgeben: Bei einer Rückgabe von "0" sind beide strings identisch!!! |
| strcpy(str1,str2) | String "str2" in "str1" kopieren |
atoi, itoa und atof - Konvertieren
Um eine Eingabe im ASCII-Format in eine Zahl zu verwandeln sind Casts unbrauchbar. Deshalb gibt es noch die 3 oben genannten Funktionen, welche diese Aufgabe übernehmen:
| #include <cstdlib> |
| int atoi(str) | ASCII to int |
| float atof(str) | ASCII to float |
| itoa(int, str, int) | int to ASCII: Parameter 1 wird in Parameter 2 gespeichert, der dritte Parameter gibt das Zahlensystem an, normalerweise "10" für dezimal... |
Dabei werden "unpassende" Zeichen ignoriert, "atof("3.50 Euro")" gibt also "3.5" zurück!
Beispielprogramm: Namen einlesen
Dieses Programm soll den Namen des Nutzers einlesen und anschließend einen Gruß ausgeben, sich kurz mit dem Nutzer unterhalten und dann beendet werden...:
- Namen einlesen
- Gruß
- Nach Alter fragen
//talk.cpp #include <iostream> #include <cstdlib> void get_vorname(char* name); bool get_alter(int &alter); std::istream& puffer_weg(std::istream& in) { return in.clear(), in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } int main() { char name[80]; int alter; std::cout << "Hallo! Wie heisst du? [max. 79]\n"; get_vorname(name); std::cout << "Hallo " << name << "!\n" << "Wie alt bist du?\n"; if (!get_alter(alter)) std::cout << "Zu alt, wie? xD\n"; else std::cout << "Du bist erst " << alter << " Jahre alt?\n"; std::cout << "Bis bald, " << name << "!\n"; return 0; } void get_vorname(char* name) { std::cin >> name; puffer_weg(std::cin); } bool get_alter(int &alter) { char calt[4]; std::cin.get(calt, 4); puffer_weg(std::cin); alter=std::atoi(calt); if (alter) return true; return false; }
Hast du die Möglichkeit, "getch" zu benutzen, kannst du auch Passworteingaben realisieren:

Vielleicht komme ich in einem späteren Kapitel darauf noch einmal zurück...
Wie geht's weiter?
Nach dieser kurzen Einführung in die Welt der C-strings kommen wir jetzt zum einfachen Teil: std::string!
|
| Seite: [1] - Drucken |
|