Taschenrechner Frage



  • Hallo!
    ich will ein Char in ein int "umcasten", d.h. einfach neu einlesen in eine Integer-Variable als in ein Char.

    Folgender Code aus der C++-Referenz:

    // istream putback
    #include <iostream>
    using namespace std;
    
    int main () {
      char c;
      int n;
      char str[256];
    
      cout << "Enter a number or a word: ";
      c = cin.get();
    
      if ( (c >= '0') && (c <= '9') )
      {
        cin.putback (c);
        cin >> n;
        cout << "You have entered number " << n << endl;
      }
      else
      {
        cin.putback (c);
        cin >> str;
        cout << " You have entered word " << str << endl;
      }
    
      return 0;
    }
    

    Wieso kommt hier dann keine Eingabe-Aufforderung trotz cin? In meinem Code fragt er nach einer Eingabe. Ich kann eingeben, was ich will, am Ende füllt er in die Variable den korrekten Wert. Wie "unterbinde" ich die Eingabe-Aufforderung?

    // main.cpp
    char str[8];
    cin.getline(str, 8);
    TRechner t1;
    t1.Calc(str);
    
    //calc.hpp
    char curr;
    char *line;
    
    // ...
    
    void TRechner::Calc(const char *l) { // Bekommt C-String und soll auswerten
    	int number; // für zahlenspeicher
    	int type; // plus, minus, mal, durch, zahl oder buchstabe?
    	strcpy(line, l);
    	for(int offset = strlen(line) - 1; offset >= 0; offset--) {
    		if(line[offset] == ' ') continue;
    		type = Parse(offset); // Füllt in Attribut curr das aktuelle char, type ist aus Enum
    		switch(type) {
    			// ...
    			case NUMBER:
    				cin.putback(curr); // current char zurücksetzen
    				cin >> number; // in number einlesen, Wieso Eingabe-Aufforderung?
    				cout << "Number: " << number << endl; // ausgeben
    				break;
    			// ...
    		}
    	}
    }
    

    Danke für Hilfe!


  • Mod

    "cin" ist kein Befehl für "Mach eine Eingabeaufforderung". Das ist ein Eingabestrom. Das Konzept der C++-Streams kann ich an dieser Stelle nicht vollständig erklären, da solltest du in einem Buch oder einer guten Internetquelle nachlesen. Was der Beispielcode den du angibst ungefähr macht:

    Er bindet den header <iostream> ein. Neben den allgemeinen Streamklassen beinhaltet dieser auch einen speziellen Stream namens "cin" der an die Standardeingabe der gebunden ist (Ich vermute das soll für console-input stehen, aber genau weiß ich es nicht). Je nachdem an was für einem System du arbeitest, muss die Standardeingabe nicht unbedingt die Tastatur sein, aber diese verkomplizierung will ich hier nicht noch extra betrachen. Im folgenden nehme ich an, dass die Standardeingabe über die Tastatur erfolgt. In diesem Fall ist "cin" beim Programmstart erstmal leer. Daher kommt beim

    c = cin.get();
    

    erstmal eine Eingabeaufforderung, denn der Befehl lautet solange aus dem Strom zu lesen, bis ein newline-Zeichen kommt. Und dieses newline kommt nunmal erst, wenn man die Entertaste drückt. wird die Entertaste gedrückt ist cin wieder leer und alles was vor dem newline kam steht nun in der Variablen "c".

    Danach macht das Programm aber etwas für Anfänger sehr verwirrendes: Es schreibt mittels

    cin.putback (c);
    

    in den cin-stream. cin enthält nun den Inhalt von "c". Der nächste Befehl

    cin >> n;
    

    kann daher ausgeführt werden, ohne dass der Benutzer eine Eingabe macht, da ja schon etwas im Stream steht.

    Ich hofffe, das Beispielprogramm wäre soweit für dich erklärt.

    Zu deinem eigentlichen Problem:
    char (keine char Arrays!) kann man direkt in int umcasten, einfach static_cast<int>(charvariable) wie man das von anderen Casts kennt. Falls du meinst, eine Zeichenfolge wie "24564" in einen int umzuwandeln, so nimmt man dafür normalerweise stringstreams. Das funktioniert eingentlich genauso wie mit dem cin im Beispielprogramm, jedoch sind die Stringstreams wirklich für solche Umwandlungen da, der Gebrauch von cin dafür ist ein riskanter Missbrauch, der nur unter speziellen Bedingungen funktioniert. Ich vermute derjenige der das Beispielprogramm schrieb wollte an der Stelle einfach noch nicht auf stringstreams eingehen.

    Im Prinzip geht das so:

    std::string zahl = "12345" // eine Zeichenfolge die in einen int umgewandelt werden soll.
    std::stringstream ss;      // Dazu nehmen wir einen Stringstream
    ss << zahl;                // Schreiben die Zeichenfolge in den Stream...
    int my_int;
    ss >> my_int;              // ...und lesen sie wieder aus, dieses mal in eine int-Variable. Die Konvertierung übernimmt der Stringstream-Operator ">>"
    // my_int hat nun den Wert 12345
    

Anmelden zum Antworten