C++ Variable, Eingaben

Page updated: 19. Februar 2009


Inhalt: Variable - Datentypen - Eingabe - Länderspezifisch

Demoprogramm eingabe.cpp


Item Variable. TOP TOP

Namensbildung: Wie bei C.

Deklaration von Variablen: Variable müssen deklariert (vereinbart) werden, bevor man sie im Programm benutzen kann. Die Deklaration kann in C++ zwar jederzeit im Rumpf der Funktion main() erfolgen, bevor die Variable benutzt wird, jedoch ist es ein schlechter Programmierstil, die Deklarationen über den Rumpf zu "verstreuen": deklarieren Sie besser die Variablen gleich zu Beginn des Rumpfes der Funktion main(), lokale Deklaration genannt. Bei der Deklaration legt man Namen der Variablen und ihren Datentyp fest. Variablen können mit einem Anfangswert besetzt werden. Mehrere Variablen gleichen Typs können mit einer Deklaration vereinbart werden. Die Syntax einer Variablendeklaration ist mit der von C identisch.
Item Datentypen. TOP TOP

Es gelten die gleichen Datentypen wie bei C, jedoch gibt es zusätzliche Datentypen für Boole'sche Daten und Zeichenketten. Bei der Verwendung von Zeichenketten im C++ Stil müssen Sie die Headerdatei string über die Praeprozessoranweisung #include einbinden.

 Zu C zusätzliche Datentypen bei C++
Byte Wertebereich
bool 1  true, false
string  dynamisch
 beliebig viele Zeichen aus dem Zeichensatz

Bei Variable vom Datentyp string handelt es sich um dynamische Variable, d.h. Sie brauchen nicht wie bei C die Anzahl der max. aufzunehmenden Zeichen festlegen. Die Größe des Speicherplatzes paßt sich der jeweils aktuellen Länge der Zeichenkette an.
Item Eingabeinstanz cin. TOP TOP

Sie müssen die Headerdatei iostream über die Praeprozessoranweisung #include einbinden, damit die Instanz cin zur Konsoleneingabe dem Compiler bekannt ist.
Bei sämtlichen Eingaben mit cin ist zu beachten, daß diese gepuffert werden. Aus diesem Eingabepuffer werden dann erst die Daten herausgelesen. Alle Eingaben, die nicht aus dem Puffer gelesen worden sind - das sind in der Regel fehlerhafte Eingabezeichen und das Linefeed Tastenzeichen - verbleiben im Eingabepuffer und werden von einem später folgendem Eingabebefehl erneut gelesen. Dadurch kann es zu unerwarteten, nicht beabsichtigten und falschen weiteren Eingabefehlern kommen. Deshalb sollten Sie den Tastaturpuffer nach jeder Eingabe leeren:
  1. Bei Zahleneingaben (jedoch nicht bei Zeicheneingaben, bei Zeichenketten s. weiter unten) verwenden Sie zuerst die Methode clear(), um im Falle von alleiniger Eingabe ohne Ziffern den Status des Tastaturpuffers zurück zu setzen (sonst ist keinerlei weitere Eingabe und das Leeren des Tastaturpuffers bei 2. nicht möglich):

    cin.clear(); // Nur bei Zahleneingaben!

  2. Dann den Eingabepuffer leeren (Ausnahme Zeichenketten s. weiter unten):

    while (cin.get() != '\n'); // Bei Zahlen und Einzelzeichen

Sollten Sie für Ausgaben in C++ Programmen sowohl cin und scanf() gemeinsam benutzen, müssen Sie beide Ausgabearten mit der Methode cin.sync_with_stdio() synchronisieren:  cin.sync_with_stdio();


Manipulatoren dienen der Eingabeformatierung und können als Ausdruck in cin verwendet werden. Zur Benutzung ist die Headerdatei iomanip einzubinden.

dec
Dezimalkonvertierung (Standard).
hex
Hexadezimalkonvertierung.
oct
Oktalkonvertierung.
setw(<Breite>)
Breite für das Eingabefeld setzen.

Weiterhin weisen die Stream Klassen Methoden auf, mit denen ebenfalls die Eingaben beeinflußt werden können. Die Methode cin.setf() setzt die Flags von cin, die Methode cin.unsetf() nimmt die Flags von cin wieder zurück:

cin.setf(ios::<Flag>[, ios::<Flag>])
cin.unsetf(ios::
<Flag>
[, ios::<Flag>])


Als Flags können verwendet werden:

dec
 Dezimalkonvertierung.
hex
 Hexadezimalkonvertierung.
oct
 Oktalkonvertierung.


Besonderheiten bei der Eingabe von Zeichenketten:

Da das Leerzeichen standardmäßig Eingeben voneinander trennt, können mit cin keine Zeichenketten mit Leerzeichen eingelesen werden. Zum Einlesen von Zeichenketten mit Leerzeichen verwende man:
  1. Zum Einlesen von C Stil Strings mit Leerzeichen cin.getline():

    cin.getline(<C Stringvariable>, <Länge der C Stringvariablen>);

    Der Tastaturpuffer wird geleert mit:

    if (cin.fail())
    {
       cin.clear();
       while (cin.get() != '\n');
    }


  2. Zum Einlesen von C++ Stil Strings mit Leerzeichen sollten Sie derzeit nicht die in der STL dafür vorgesehene Funktion getline() verwenden, da viele Compiler noch nicht die STL konsequent umgesetzt haben. Verwenden Sie statt dessen den folgenden Code:

    while (<Zeichenvariable> != '\n')
    {
       <C++ Stringvariable> =
    <C++ Stringvariable> + <Zeichenvariable>;
      
    <Zeichenvariable> = (char) cin.get();
    }

Item Landesspezifische Eingabe. TOP TOP

Um landesspezifische Standards bei Ein- und Ausgaben (Dezimalkomma) bei cin() zu setzen, müssen Sie die Headerdatei locale über die Praeprozessoranweisung #include einbinden und die imbue() Methode bei cin benutzen. "german" ermöglicht die Eingabe des Dezimalkommas, "english" die Eingabe des Tausendertrenners Komma und des Dezimalpunkts, "C" ist der C/C++ Standard ohne Tausendertrenner mit Dezimalpunkt:

cin.imbue(locale("german"));
cin.imbue(locale("english"));
cin.imbue(locale("C"));

Um landesspezifische Standards bei Ein- und Ausgaben (Dezimalkomma) bei printf() und scanf() in C++ Programmen zu setzen, müssen Sie die Headerdatei clocale über die Praeprozessoranweisung #include einbinden und die setlocale() Funktion benutzen. Siehe -> C. Die Einstellung gilt für Ein- und Ausgaben.


Dr. J. Kubiak j.kubiak@gmx.net