Eingabe über cin
-
Hallo,
ich habe ein bereits bestehendes Programm, das zur Eingabe von Variablen die cin Funktion benutzt. Nun möchte ich die bisherige Eingabemöglichkeit erweitern, indem das Programm bei Eingabe von Enter einen Standartwert annimmt. Bei cin wird jedoch bei Enter ohne vorherige Eingabe nur ein Zeilenvorschub gemacht, und weiter auf eine Eingabe gewartet.
Ich habe über Google zwar einige Lösungsansätze gefunden, jedoch war keine dabei, die eine cin Eingabe verwendet, und da das Programm mitlerweile einigen Umfang hat, würde ich gerne wissen, ob es da eine einfachere Lösung gibt.Hier nun der Quellcode einer der Aktuellen abfragen:
#include "Daten.h" #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; int main (void) { w = 1; while (w == 1) { w = 0; cout<<"\nEingabe:(Standartwert 5)?\n"; cin>>Daten.eins; if (Daten.eins == 0) { Daten.eins = 5; } else if (Daten.eins < 0) { printf( "Falsche Eingabe.\n"); w = 1; if (cin.fail()) { cin.clear(); while (cin.get() != '\n'); } } } }Aktuell Funktioniert die Standarteingabe über die Eingabe von 0, dies soll dann verbessert werden.
Danke für eure Hilfe. Ich hoffe ich habe mich verständlich genug ausgedrückt.
FSl
*Rechtschreibung bearbeitet
-
per getline einen string einlesen und diesen dann entsprechend behandeln. Zum Parsen diesen in einen stringstream geben und dann wie cin behandeln. Wäre eine Option.
-
FSl schrieb:
*Rechtschreibung bearbeitet
<Klugscheissmode>
Standard schreibt man auch nach der Rechtschreibreform immer noch mit 'd' am Ende
</Klugscheissmode>
-
Die Eingabe des Strings ist kein Problem, aber den stringstream verstehe ich noch nicht, ich muss ja 3 fälle unterscheiden, 1. Enter wird gedrückt ohne Eingabe, das müsste ja dann bedeuten das meine Eingabe == 0 ist, oder irre ich mich schon da? Der 2. Fall wäre eine Positive Zahl, bei der die Eingabe als Zahl weitergegeben wird, und der 3. Fall wären Zeichen bzw eine Negative Zahl, welche ich dann abfangen muss.
-
FSl schrieb:
Die Eingabe des Strings ist kein Problem, aber den stringstream verstehe ich noch nicht, ich muss ja 3 fälle unterscheiden, 1. Enter wird gedrückt ohne Eingabe, das müsste ja dann bedeuten das meine Eingabe == 0 ist, oder irre ich mich schon da? Der 2. Fall wäre eine Positive Zahl, bei der die Eingabe als Zahl weitergegeben wird, und der 3. Fall wären Zeichen bzw eine Negative Zahl, welche ich dann abfangen muss.
Es gibt zwei Möglichkeiten, wenn du die getline-Methode verwendest.
- Der Benutzer drückt einfach Enter: Dann ist der string anschließend leer (size() = 0)
- Er gibt noch was anderes vor Enter ein (size != 0). Dann kannst du dir einen stringstream (achte darauf, dass der header dafür wohl aus historischen gründen etwas unintuitiv sstream benannt wurde) mit dem string basteln und dann genauso damit arbeiten, als hättest du cin benutzt für eine normale Eingabe.
-
Wenn Du direkt Werte mit cin einliest, dann hasst Du hinterher nicht zwangsläufig einen String, sondern eben einen Wert vom eingelesenen Typen.
Beispiel:int a; std::cin >> a; //wenn alles gut ging, hast Du einen int und keinen StringWenn Du mit std::getline arbeitest, hast Du immer einen String. Den kannst Du zunächst darauf prüfen, ob er z.B. leer ist, oder ob bestimmte Sequenzen enthalten sind (quit z.B.).
Danach kanst Du den String mit Hilfe von std::stringstream in andere Typen konvertieren.
-
Danke nochmal für die Tips, habs damit hinbekommen, nur gibt es noch eine kleinigkeit, ich hab jetzt zum Konvertieren des Strings in Double atof verwendent, und wenn ich eine Zahl gefolgt von einem Buchstaben eingebe, wird die erste Zahl angenommen (z.b. 4b3 => 4) das ist vor allem bei Eingaben wie 3,5 anstelle von 3.5 ärgerlich.
Wenn da noch jemandem was einfallen würde bin ich glücklich.
-
So ich hab jetzt alle Probleme gelöst, die ich mir teils selbst aufgebrummt hab, falls jemand mal ähnliche Probleme hat wollte ich nur noch meinen fertigen Code reinstellen.
Achtung, das ganze ist ein ziemliche zusammengewürfelter Misch aus verschiedensten Formaten und ist auch nicht wirklich optimal geschrieben, jedoch stehe ich etwas unter Zeitdruck, und habe nicht die Zeit das ganze noch einmal sauber zu programmieren.
#include "Datendefinition.h" #include <stdio.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <string> using namespace std; int main (void) { Datendefinition Daten; int w = 0, ww = 0, length = 0, numonly = 1; string input; char inputchar[256]=" "; const char *inputcharp; system("cls"); w = 1; ww = 1; while (w == 1) { w = 0; cout<<"\nEingabe: (Standartwert: 5)?\n"; getline (cin ,input); if (input.empty()) { Daten.eins = 5; } else { inputcharp = input.c_str(); strcpy( inputchar, inputcharp); length = strlen(inputchar); while (ww < length) { if (isdigit(inputchar[ww]) == 0 && inputchar[ww] != '.') { numonly = 0; } ww++; } if (numonly != 0) { Daten.eins = atof(input.data()); } } if (Daten.eins <= 0) { cout<<"Falsche Eingabe.\n"; w = 1; } numonly = 1; }
-
Viel zu kompliziert. std::stringstream macht schon alle Checks für Dich.
Irgendwie so vllt. Evtl. gehts noch einfacher, und evtl. sind noch irgendwelche Fehler drin:
#include "Datendefinition.h" #include <iostream> #include <sstream> #include <string> int main ( ) { Datendefinition Daten(5); bool succeeded = true; std::string input; do { std::cout<<"\nEingabe: (Standartwert: 5)?\n"; std::getline (std::cin, input); if ( !input.empty() ) { std::stringstream str(input); if( !(str >> Daten.eins) ) { succeeded = false; std::cout<<"Falsche Eingabe.\n"; } else { succeeded = true; } } } while( !succeeded && !input.empty() ); std::cout << Daten.eins << '\n'; }