prüfen ob Zahl eingegeben wurde und char to int
-
Hallo erstmal
Ich habe erst vor ein paar Tagen mit c+ angefangen und auch vorher nicht programmiert (außer ein ganz bisschen rumgescriptet mit c#). Im Moment schlage ich mich durch Vollkards c++ Kurs. Dabei gibt es ein Kapitel, wo ein kleines Münzspiel erstellt wird: http://www.volkard.de/vcppkold/nimmspiel.html
Das hat mir ganz gut gefallen und ich habe noch ein bisschen daran herumgebastelt^^ Und jetzt will ich irgendwie überprüfen, ob eine Eingabe eine Zahl (ein integer Wert) ist und ich vermute mal, diese Überprüfung kann ich nur mit einem char Wert machen und muss dann noch konvertieren... mag sein, dass ich hier nur Müll von mir gebe
Auf jeden Fall weiß ich da nicht mehr weiter, google hat mir auch nicht mehr geholfen. Hier nochmal ein bisschen code um das ganze zu verdeutlichen:(...) int main() { char anz_mue; int anzahl_muenzen; cout << "Geben Sie bitte die Anahl der Muenzen ein: " << endl; cin >> anz_mue; //hier sollte dann die Überprüfung stattfinden ob der wert eine Zahl ist... anzahl_muenzen = ...//konvertiertung... (...)
So irgendwie hatte ich mir das gedacht, aber bis jetzt wie gesagt nichts brauchbares herausbekommen, da ich bei der Überprüfung gar keinen Ansatz habe und die Konvertierung habe ich irgendwie mit atoi versucht, das war nichts...
wäre dankbar wenn mir jemand helfen könnte
und eine kleine Sachen noch? Weiß jemand warum man nicht mehr auf tutorial.schornboeck.net kommt? Dieses tutorial hat mir sehr gut gefallen, aber nun komme ich nicht mehr heran...
-
Hallo,
Alhric schrieb:
Und jetzt will ich irgendwie überprüfen, ob eine Eingabe eine Zahl (ein integer Wert) ist und ich vermute mal, diese Überprüfung kann ich nur mit einem char Wert machen und muss dann noch konvertieren
Nope. Du kannst auch prüfen ob du eine Zahl erfolgreich einlesen konntest.
Beispiel:
#include <iostream> using namespace std; int main() { cout << "input a number: "; int x; while(!(cin >> x)) // falls ein Fehler beim Einlesen der Zahl auftritt. // (Bzw. falls der Wert, der für x angegeben wird, nicht als int dargestellt werden kann) { cout << "I expect a number!\n"; // Meldung ausgeben. cin.clear(); // Eventuelle Fehlerflags löschen. cin.ignore(9999, '\n'); // Eingabe-Puffer leeren. } cout << "\nentered value: " << x << endl; // Zahl ausgeben. }
Infos zu clear() und ignore().
Gruß Caipi
-
atoi(3)
Du musst den String noch in ein Char-Array umwandeln
std::string.c_str()
-
vielen Dank für die antowerten
die Methode von Caipi klappt eigentlich und ich verstehe sogar was sie macht
aber leider funktioniert sie eben doch nur auf den ersten Blick... wenn ich "a" eingebe gehts, wenn ich "a23" eingebe auch, aber bei "2a" zum Beispiel gehts nicht, wie bei allen eingaben bei der eine Zahl am Anfang steht. So habe ich das bei mir eingebunden:int anzahl_muenzen; cout << "Mit wievielen M" << char(129) << "nzen wollen Sie spielen?" << endl; while(!(cin >> anzahl_muenzen)) { cout << "Bitte eine Zahl eingeben!" << endl; cin.clear(); cin.ignore(9999,'\n'); }
bei "cin.ignore(9999,'\n'" bin ich mir zum Beispiel nciht sicher, da ich noch nicht verstanden habe, was in der Klammer angegeben wird... habe ich da noch einen Fehler drin?
Oder muss ich eine andere Methode verwenden?
-
Alhric schrieb:
[...]wenn ich "a23" eingebe auch, aber bei "2a" zum Beispiel gehts nicht, wie bei allen eingaben bei der eine Zahl am Anfang steht.[...]
Genau das ist das Handycap an dieser Vorgehensweise :(. Tut mir leid, aber mir ist keine direkte Möglichkeit bekannt direkt über die iostreams zu prüfen ob eine Zahl (getrennt von Whitespaces) eingegeben wurde... (Würde mich ebenfalls interessieren, ob es eine derartige Lösung gibt).
Falls du nicht mit dieser Einschränkung leben kannst, musst du wohl doch umwandeln: Siehe dazu in der C++-FAQ: Einmal Zahl nach String und zurück.
Gruß Caipi
-
gut... wenn ich jetzt in der FAQ die erste Methode unter string nach zahl neheme, beispielsweise, kann ich dann damit auch direkt nach int umwandeln?
-
Alhric schrieb:
gut... wenn ich jetzt in der FAQ die erste Methode unter string nach zahl neheme, beispielsweise, kann ich dann damit auch direkt nach int umwandeln?
Wie meinst du das?
Weil im Beispiel ein double verwendet wird? Das ist irrelevant => Ja, Du kannst auch direkt in einen int umwandeln. :). Wobei mir gerade auffällt, dass die std::stringstream Methoden die gleiche Einschränkungen haben, wie das direkte prüfen des istreams... Dann bleiben wohl nur die Funktionen atoi() und strtol() und Konsorten, wobei ich hier auf strtol zurückgreifen würde, da diese eine bessere "Fehlerbehandlung" (falls man das hier überhaupt so nennen darf...) enthält (imho).Gruß Caipi