std::cin "funktioniert nicht"
-
Hallo an Alle,
ich bin Anfänger in Programmierung und C++ im Speziellen und ich bin mir auch nicht ganz sicher, ob ich das richtige Unterforum erwischt habe. Ich bin auch stets darum bemüht, mir selbst die richtige Lösung zu liefern, weil es gerade das ist, was mir an Programmierung Spaß macht: Problemlösung.
Allerdings weiß ich überhaupt nicht weiter. Ich habe den folgenden Code auch aus dem Gesamtprogramm isoliert, Variablen geändert, Schleifen herauskommentiert, um zu verstehen, warum der zweite cin-Befehl in Zeile 31 nicht durchgeführt wird.
Hier der isolierte Code, der zwar compiliert, aber eben nun mal in der zweiten Schleife keine Eingabe fordert, sondern sich beendet.
#include <iostream> #include <string> using namespace std; int main() { cout << "Project: ... with [*Variable*] and [*Variable*]" << endl; cout << "> Enter subject values for (type \"ok\" to end)\n" << endl; double nValueA[1000] = { 0 }; int iii = -1; // Fetch subject variables, break with !integer do { iii++; cout << "(" << "nGroupNameA" << ") - Value " << iii+1 << ": "; cin >> nValueA[iii]; } while (nValueA[iii]); cout << "Project: ... with [...] and [...]" << endl; cout << "> Enter subject values for (type \"ok\" to end)\n" << endl; double nValueB[1000] = { 0 }; iii = -1; // Fetch subject variables, break with !integer do { iii++; cout << "(" << "nGroupNameB" << ") - Value " << iii+1 << ": "; cin >> nValueB[iii]; } while (nValueB[iii]); return 0; }
Wie kann es sein, dass die zweite Schleife nicht auf die selbe Art und Weise die Eingabe fordert, wie die erste Schleife?
(...und bei der Gelegenheit: Wie kann ich ein Array im Vorfeld definieren, dessen Größe durch die nachfolgende Eingabe bestimmt wird? In meinem Fall habe ich einfach mal 1000 eingegeben, aber das ist nicht sonderlich schön gelöst...)
Vielen Dank im Voraus!
-
Der beschriebene Fehler tritt bei mir nicht auf. Welchen Compiler und welches Betriebssystem verwendest Du denn ?
Wobei:
1. Vergleiche mit double nicht so optimal sind.
2. Der Wert 0.0 ist keine boolesche Variable; die eigentlich erwartet wird.Wie man dynamischen Speicher anfordert würde man mit Google wohl doch eher
leicht rausbekommen ...unsigned groesse = 0; cout << "Groesse: "; cin >> groesse; double *nValueA = new double[groesse]; // ... delete[] nValueA; // Speicher wieder freigeben nValueA = 0;
-
Compiler: Visual C++ 2010 Express
OS: Windows 7 Home Premium 64 BitIch starte die *exe mit Strg+F5:
http://www.directupload.net/file/d/3932/djqfc5jn_png.htmEdit:
Der Fehler tritt ebenfalls auf, wenn ich die Schleife auskommentiere. Irgendwie hakt es an Zeile 31 (?)
-
Wsa gibst du denn ein, um die erste Schleife zu beenden?
-
"ok" oder "asdf", eben kein integer/double ...
-
Abbruch mit ok ? Genau da passieren gleich mehrere Katastophen!
Wie ich oben bereits gesagt hatte
" Der Wert 0.0 ist keine boolesche Variable; die eigentlich erwartet wird."
Wenn Du sofort als erstes ok eingibst werden alle weiteren Eingaben übersprungen - und nichts zugewiesen.
Nur weil Du das Array "zufällig" mit Nullen gefüllt hast bricht es überhaupt ab; ansonsten würde die Schleife nach Eingabe von "ok" munter weiterlaufen, da ok eben nicht false ist!!!
- Der Wert 0 wird nicht zugewiesen bei Eingabe einer Nichtzahl!!
- Das "ok" verschwindet nicht "von selbst" aus dem Tastaturpuffer!
Da die Abbruchbedingung auch nicht die Arraygroesse berücksichtigt kann die Schleife zudem
auch über das Arrayende hinaus laufen.Diese Probleme solltest Du mal ausbessern!!
-
Nachtrag:
Wenn der cin stream erstmal was in den falschen Hals bekommen hat muss der Fehler qittiert und die falschen Zeichen entfernt werden (clear() und ignore()).
-
Besten Dank ... das habe ich völlig übersehen bzw. kaum wissen können.
Ich habe es nun so gelöst, dass die Schleife mit einer "0" beendet wird. Ich fand sonst keine Lösung, die Schleife durch diesen einen Input mit einem String zu beenden.
-
Katharsis schrieb:
Besten Dank ... das habe ich völlig übersehen bzw. kaum wissen können.
Ich habe es nun so gelöst, dass die Schleife mit einer "0" beendet wird. Ich fand sonst keine Lösung, die Schleife durch diesen einen Input mit einem String zu beenden.
Was soll daran schwierig sein, im Fehlerfall zu prüfen ob jmd. ok eingegeben hat?
cout << "> Eingabe Feld-A (\"ok\" für ENDE)\n" << endl; for(unsigned i=0; (i<groesseA) & cin.good(); i++) { string estr; cout << "(" << "nGroupNameA" << ") - Value " << i+1 << ": "; cin >> nValueA[i]; if(cin.fail()) { cin.clear(); // Zugriff auf cin wieder freigeben cin >> estr; if(estr == "ok") break; // Keybd-Puffer hier evtl. leeren! } };
-
Ich kannte den Befehl cin.fail() nicht.
Aber Danke!Kurze Verständnisfrage: Warum fordert das Programm bei Zeile 9 keine separate Eingabe vom Benutzer, sondern arbeitet mit dem Input von Zeile 6? Ich würde den Code so verstehen, dass - falls die Eingabe in Zeile 6 nicht zum Variablenformat passt - in Zeile 9 eine neue Eingabe gemacht werden muss.
-
stream extraction operators (
operator>>()
) "fordern" garnix vom Benutzer. Sie lassen den Stream auch nicht auf irgendeine magische Weise auf irgendetwas warten, noch irgendwas in die Richtung. Extrahiert werden so lange Zeichen aus dem Streambuffer des Streams, solange sie zum geforderten Typ passen. Die Zeichen sind zu diesem Zeitpunkt aber schon im Puffer, und bleiben auch darin, wenn sie nicht extrahiert werden können:#include <iostream> #include <string> int main() { double value; std::cin >> value; std::string word; std::cin >> word; std::cout << "value: \"" << value << "\"\nword: \"" << word << "\"\n\n"; }
Versuch das mal mit der Eingabe von
"1.23blablub[Enter]"
.
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (alle ISO-Standards) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.