auslesen eines wertes aus einem string,nur 6 stellen genauigkeit möglich...need help.bitte auf letzte seite schauen
-
while (cin >> wert) zahlen.push_back(zahl);
-
cool das geht schonmal besser
ist es noch irgendwie möglich das die while schleife erkennt ob ich enter gedrückt habe um dann die eingabe zu beenden
weil so wies jetzt ist gehts nur mit nem buchstabenhab da schon ne fkt gefunden die eventuell helfen könnte
GetAsyncKeyState(int vKey)die Zahl in klammern steht für enter
VK_RETURN (0D)
ENTER keyhab das jetzt so eingebunden
while(GetAsyncKeyState() != 0D ) { cin >> wert; zahlen.push_back(wert); }nur meckert der compiler da bei der fkt
mfg
-
Okay, gute Frage. Das Problem mit diesen ganzen Eingaben ist, dass sie nicht wirklich für die Konsole konzipiert und geeignet sind. Standardmäßig würde man diese Eingabe per Strg+D beenden; das ist die „korrekte“ Art, aber das macht natürlich kein Benutzer.
Die einfachste Variante ist wohl, einen String einzulesen und auseinanderzunehmen:
int main() { string line; getline(cin, line); stringstream sstr; sstr << line; int zahl; vector<int> zahlen; while (sstr >> zahl) zahlen.push_back(zahl); }
-
GetAsyncKeyState und streams passen nicht zusammen.
#include<string> #include<stringstream> //eine zeile bis <Enter> einlesen std::string str; std::getline(std::cin,str); //Die eingelesene Zeile in einen anderen stream packen std::stringstream stream; stream<<str; //und nun aus diesem stream lesen while (stream >> wert) zahlen.push_back(zahl);@Konrad rofl. identisch

-
irgendwie hab ich keine stringstream header datei
nutze DEV C++mfg
-
Der Header heißt komischerweise <sstream>.
-
Konrad Rudolph schrieb:
Der Header heißt komischerweise <sstream>.
da vertue ich mich ohne compiler immer :). Gibt auch einen header <strstream> für die Klasse strstream, und damit ist für mich die verwirrung komplett

-
geil jetzt gehts

vielen dank euch allen
mal noch nee kleine informative frage
warum werden die eingelesenen werte in einen anderen string kopiert?und warum steht einmal im quelltext std:: davor und einmal nicht?
mfg
-
ich kann das jetzt leider nicht ausprobieren, aber ich denke ein
int tmp; vector v; while (cin >> tmp) { v.push_back(tmp); char c = cin.get(); if (c == '\n') break; else cin.putback(c); }sollte statt des stringstreams auch reichen.
-
danke das funktioniert auch

kannst du mal erklären was die letzten 3 zeilen machenmfg
-
hab noch ein kleines problem,die eingabe einer zeile klappt ja schon ohne probleme,dank euch

nun stehe ich aber vor dem problem wenn man mehrere zeilen eingeben willhab das jetzt mal so versucht,das man so lange neue zeilen eingeben kann bis der wert 999 eingegebene wird
nur das is ja keine richtige lösung
wie kann ich es machen das die eingabe beendet wird wenn ich zum beispiel e drücke oder wenn ich enter drücke und vorher keinen wert eingegeben habeint tmp; while(tmp != 999) { while (cin >> tmp) { m1 >> tmp; //ist von meiner überladenen >> fkt,der wert wird dort direkt in ne zeile geschrieben char c = cin.get(); if (c == '\n') { m1 >> nz; //auch vom überladenen operator,erstelt einen neuen zeilenvektor break; } else cin.putback(c); } }vll hat noch wer ne gute idee für den abbruch
EDIT
hab selber noch einewhile(tmp != NULL && c != '\n')falls das NULL nicht geht kann mir wer sagen was da stehen muss wenn noch kein wert eingegeben wurde
mfg
-
Braineater schrieb:
mal noch nee kleine informative frage
warum werden die eingelesenen werte in einen anderen string kopiert?Wie du festgestellt hast, terminiert
while(cin>>wert) {...}nicht so ohne weiteres. das liegt daran, dass cin solange einliest, wie wir daten erfragen, und solange wir daten erfragen, bittet cin um Benutzereingaben. Wie du gemerkt hast, ist das nicht so toll, der standardweg um dies abzubrechen ist nämlich das zeichen '\0' einzugeben. Dies ist das End of file zeichen. liest cin das, setzt es das eof flag, und die schleife bricht ab.
Wir umgehen diesen mechanismus jetzt, indem wir einfach nur eine ganze zeile bis zum '\n' zeichen einlesen, also bis der benutzer das erste mal enter drückt.
das funktioniert mit getline. Danach kopieren wir diesen string in einen stringstream und stringstream bricht ab, sobald der interne stringpuffer leer ist(also der ganze zeicheninhalt ausgelesen wurde). Deshalb kopieren wir den string
und warum steht einmal im quelltext std:: davor und einmal nicht?
Ich hab std:: angegeben weil ich kein
using namespace std;in meinem Code hab, und deswegen den namespace separat angebe(und ich machs ausserdem aus gewohnheit).
Nebenbei ist die Lösung mit
if (c == '\n')nicht ganz so sicher, da du dann davon abhängst, dass der nutzer nahc der letzten zahl sofort <Enter> drückt, und nicht vorher zb noch <Leerzeichen>.
Würdest du das zum Beispiel später mit einer Datei machen(also daten aus der datei lesen), dann hättest du das Problem, dass unter Windows am Ende jeder Zeile ein "\r\n" steht, und nicht nur '\n'.zu deiner Frage:
Wenn du einfach nur bei einer "999" abbrechen willst, reicht doch einfachint tmp; cin>>tmp; while(tmp!=999) { //tu was mit tmp //... cin>>tmp; }oder wenn die Schleife abbrechen soll, wenn der benutzer einfach nur was anderes als eine zahl eingibt:
while(cin>>tmp) { //tu was mit tmp }also dein ursprungscode

-
die abbruchbedingung soll aber nur für neue zeilen gelten...also das man mehrere zeilen eingeben kann und das dann irgendwie abbrechen kann
999 würde da gehen ist aber nicht sehr sinnvoll falls mal ein user 999 verwenden will
gibt es nicht ne andere möglichkeit...z.b. ne bedingung wenn der verctor 0 elemte hat u man enter drück dann bricht es die eingabe ab
-
so falls es jemand interessiert oder es noch wer brauchen hier ist ne gute lösung zu kompletten eingabe einer matrix (danke an alle die mitgeholfen haben)
werte einer zeile können nacheinander mit leerzeichen getrennt eingegeben werden...sobald man nach einer leeren zeile enter drückt ist die eingabe abgeschlossenint help=1; while(help != 0) { string line; getline(cin, line); stringstream sstr; sstr << line; double wert; vector<double> zeile; while (sstr >> wert) { zeile.push_back(wert); } help=zeile.size(); }mfg
-
bin doch noch auf ein problem gestoßen
man kann keine kommawerte eingeben
die zahlen werden ab dem komma abgeschnitten
kann mir da noch wer helfen?EDIT:
nach einigen testen bin ich nun drauf gekommen,das die string methode doch kommazahlen lesen kann,nur leider kann sie nur zahlen mit insgesamt max 6 stellen länge auslesen...kann man die fkt irgendwie noch verbessern das sie z.b. auch zahlen mit 10 stellen oder mehr auslesen kannmfg