auslesen eines wertes aus einem string,nur 6 stellen genauigkeit möglich...need help.bitte auf letzte seite schauen
-
ich habe ein kleines poblem
cih sitze grade daran eine eingabe für eine matrix zu schreiben.Der benutzer soll die zahlen einer zeile nur durch komma getrennt eingeben können,das habe ich über ein array auch schon hinbekommennun habe ich eine frage:
wie kann ich einen array erstellen welches automatisch immer wieder verlängert wird?bis jetzt sieht die eingabe fkt so aus
int test[9]; for(int i=0;i<9;i++) { cin>> test[i]; } ...wie kann ich das array so verändern das es dynamisch immer länger wird?
mfg
-
Google / Forensuche: std::vector, std::vector::push_back
Dynamisch kannst du ein Array auch mit realloc vergrößern, das ist weder so schön noch so komfortabel und gegen Programmierfehler geschützt wie std::vector::push_back.
Beispiel:
#include <iostream> #include <vector> int main() { std::vector<int> zahlen; std::cout << zahlen.size(); // ausgabe: 0 // hinzufügen zahlen.push_back(45); zahlen.push_back(42); std::cout << zahlen.size(); // ausgabe: 2 }
-
an pushback hatte ich auch schon gedacht,nur da is die eingabe nicht so kompfortabel,da ich nach jedem wert enter drücken muss,oder?
oder kann man das irgendwie so programmieren,das es bis man z.b. enter drück alles einließt was man hinschreibt leerzeichen würde dann nächstes element bedeuten
-
Braineater schrieb:
an pushback hatte ich auch schon gedacht,nur da is die eingabe nicht so kompfortabel,da ich nach jedem wert enter drücken muss,oder?
Das ist doch bei Deinem Code oben genauso, und das hat nichts mit dem Datencontainer zu tun sondern mit der C++-Eingabe.
-
man kann bei der eingabe von mir die werte alle nacheinander getrennt mit leerzeichen eingeben

-
Na dann zerhackst du den Eingabestring an den Leerzeichen und pusdhst die Werte nacheinander in den Vector.
-
Braineater schrieb:
man kann bei der eingabe von mir die werte alle nacheinander getrennt mit leerzeichen eingeben

Ja, und wieso soll das bei der Verwendung von 'std::vector' bitte nicht mehr gehen?
-
ok nehm alles zurück,du hast recht...habs grade versucht...nun hab ich nur noch das problem das ich nicht weiß wie ich nen abbruch hinbekomme
also ne fkt die so lange zeichen einließt bis ich enter drückbis jetzt hab ichs so
for(int i=0;i<4;i++) { cin>> wert; zahlen.push_back(wert); }nur die anzahl der durchläufe müsste dynamisch sein
kann mir da wer helfen?mfg
-
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