Anfänger (while-Schleife)
-
Oder spar es Dir ganz mit C++:
while(i<0) { cout << "Geben Sie eine Zahl ein: "; cin >> i; }
Gruß,
Simon2.
-
The-Kenny:
%d liest einen decimal integer. %lf wäre double.Greetz
-
Danke für die Antwort. Leider muss ich aber immer noch zweimal eine positive Zahl eingeben.
-
Nur mal ins Blaue: Gibst Du "1.23" ein oder "1,23" ?
Gruß,
Simon2.
-
Vellas schrieb:
The-Kenny:
%d liest einen decimal integer. %lf wäre double.Greetz
Sorry *g*
Das kommt davon, wenn man sich garnicht mit den C-Techniken, sondern gleich mit denen von C++ beschäftigt
-
Simon2 schrieb:
Nur mal ins Blaue: Gibst Du "1.23" ein oder "1,23" ?
Gruß,
Simon2.
Ich geb 5 ein
-
mit 5.0 klappt es... aber wieso? und wie krieg ich es hin, dass es auch mit 5 funktioniert?
-
mach doch mal den Zeilenumbruch bei scanf raus, dann gehts direkt
-
ohje, wenn nur alles so einfach wäre!
Jetzt hab ich nur noch das Problem, dass das programm verrückt spielt, wenn keine zahl sondern ein buchstabe eingegeben wird.
-
naja das kannste so abfangen
if(!cin) { //mach irgendwas, eine fehlermeldung z.B. cin.clear();cin.ignore() }
-
ist i eine Fließkommerzahl? (double, float) Dann kann das nicht gehen ^^ Ehm mach mal eine Ganzzahl (Integer) daraus!
#include <iostream> int main() { int number(-1); while (i < 0) { std::cout << "Geben Sie eine Zahl ein: " << std::flush; std::cin >> i; } }
... jetzt kannst du einfach "5" eingeben und es geht
So. Dann zu deinem Problem. Du musst halt eine falsch-Eingabe abfangen (bei C++ viel einfacher als bei C.. darum auch lieber Streams nutzen (std::cin)).
std::istream& clstream(std::istream& in) { in.sync(); in.clear(); // failbit und badbit löschen in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Maximale Datenmenge die in einen stream gehen (std::numeric_limits<std::streamsize>::max() // oder bis zum nächsten '\n' alles aus dem // Eingabe-Buffer schmeißen. Hängt damit zusammen, // das es sich um eine gebufferte Eingabe handelt. return in; }
... so =>
std::cin >> i;
ließt ja deine Zahl ein. Jetzt wird das failbit des Streams gesetzt, wenn du eine für den Datentyp inkompatible Eingabe machst. std::istream hat den operator! überladen, und kannst so konfortabel überprüfen, ob ein Fehler aufgetreten ist:
do { clstream(std::cin) >> i; } while (!std::cin);
So, das kann man sich dann noch in ein Template packen:
template<typename T> void read_type(std::string const& prompt, T& dest) { do { std::cout << prompt << std::flush; } while (!(clstream(std::cin) >> dest)); }
-
(D)Evil, du hast schon gelesen, dass im Titel "Anfänger" steht, oder? Du erklärst zwar gut, aber ich bezweifle, ob ihm Templates nun viel weiter helfen
-
Aber ich finde man sollte die read_type-Funktion jetzt mal ins F.A.Q. packen (und clstream dann nat. auch :P), damit Anfänger nicht jedesmal danach fragen und vor allem dann nicht eine inkorrekte Version aus dem F.A.Q. nehemen (siehe ein paar Topics weiter oben).
-
Was soll denn "clstream" heißen? Typo?
-
? clearstream abkürzung und steht auf der verlinkten Seite ... erst Stream aufräumen und dann ein Zeichen einlesen ... ? wo ist jetzt dein Problem?
-
clear_stream