Schleife mit ESC abbrechen
-
Guten Abend!
Wie schon die Topicüberschrift verrät versuche ich eine Schleife mit der ESC-Taste abzubrechen.
Zur Schleifenfunktion: Die Schleife sollte bis man die ESC-Taste drückt, Zahlen in ein Array einlesen.
Klappt auch alles bis auf den Abbruch mit ESC.
Wäre dankbar für jeden Ansatz!#include <iostream> #include <conio.h> using namespace std; int main(){ int array[50]; char pressedkey; cout << "Mit ENTER Eingabe bestaetigen und mit ESC die Eingabe abbrechen." << endl; for (int i = 0; i < 50; ++i) { cin >> array[i]; if (kbhit()) { pressedkey = getch(); if (pressedkey == 27) { break; } } } system ("pause"); return 0; }
-
#include <cstdio> using namespace std; const char* ASCII[] = { "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", "BS", "TAB", "LF", "VT", "FF", "CR", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US", "SPC", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "DEL"}; int main() { const static char ESC = 0x1B; char c = 0; do { c = getchar(); printf("key pressed = %s\n", ASCII[(size_t)c]); } while(c != ESC); return 0; }
-
Ich habe es jetzt anders gelöst.
Mein Gedanke war, dass die Schleife ja immer bis zur Eingabe läuft und da wartet. Sie hat also die Prüfung ob ESC gedrückt wurde übersprungen da man kurz zuvor die Entertaste bei der Eingabe betätigt hatte und anscheinend das in der IF-Anweisung ausgewertet.
Also habe ich da eine Sleep-Funktion eingebaut sodass das Programm vor der IF-Anweisung wartet.#include <iostream> #include <conio.h> #include <Windows.h> using namespace std; int main(){ int grundmenge = 0; int array[50]; char pressedkey; cout << "Mit ENTER Eingabe bestaetigen und mit ESC die Eingabe abbrechen." << endl; for (int i = 0; i < 50; ++i) { cin >> array[i]; ++grundmenge; while (!kbhit()) //Warteposition Sleep(10); if (kbhit()) { pressedkey = getch(); if (pressedkey == 27) { break; } } } for (int n = 0; n < grundmenge; ++n) //Ausgabe des Feldes { cout << array[n] << " " << endl; } system ("pause"); return 0; }
-
Also ich hab zwar keine Ahnung was dein eigendliches Problem ist - artikulier dich doch mal präzise, aber das hört sich so oder so einfach nur haarsträubend an:
Also habe ich da eine Sleep-Funktion eingebaut sodass das Programm vor der IF-Anweisung wartet.
-
gast0815 schrieb:
Also ich hab zwar keine Ahnung was dein eigendliches Problem ist - artikulier dich doch mal präzise, aber das hört sich so oder so einfach nur haarsträubend an:
Also habe ich da eine Sleep-Funktion eingebaut sodass das Programm vor der IF-Anweisung wartet.
Schaut so aus dass er nicht Enter drücken will und trotzdem mit ESC abbrechen... keine Ahnung ob das mit standard c++ überhaupt geht ... man kann sich das Leben halt unnötig schwer machen XD
-
Das Ziel war, das ich die Schleife mit ESC abbrechen wollte, noch bevor das Array voll ist. Problem war das es auf die ESC-Taste nicht reagiert hat weil die IF-Anweisung die überprüfen sollte ob die ESC gedrückt wurde, die Eingabetaste beim Eingeben der Werte in das Array überprüft hat.
Das habe ich wiederrum mit der Sleepfunktion behoben sodass die Schleife vor der IF-Anweisung wartet.
und wers einfacher kann soll es hier posten ...

-
user369 schrieb:
und wers einfacher kann soll es hier posten ...

Darf ich die Anforderung etwas ändern? Escape ist doof. Besonders wenn dadurch das Programm unterbrochen werden soll, weil wir dann das gelobte Land des Sprachstandards verlassen. Was aber ganz einfach ist, ist festzustellen, ob die letzte Eingabe funktioniert hat. Wenn eine Zahl eingegeben werden sollte und es kam ein Buchstabe oder das Dateiende oder meinetwegen auch ein Escape-Zeichen, dann können wir ganz einfach abbrechen. Aber speziell nur auf Escape zu reagieren ist kompliziert, denn dann müssen wir erst einmal alles einlesen und nach Escapes suchen und wenn keine drin sind, müssen wir die Zahlen raussuchen und wenn Buchstaben drin sind, müssen wir auch drauf reagieren. Du merkst: Unnötig kompliziert, wenn man es auch wie bei mir in Zeile 9 machen kann und damit mit einer Zeile alle möglichen Ausnahmen abdeckt.
Feste Arrays sind auch doof, besonders wenn wir vorher nicht wissen, wieviel kommt. Da müssen wir uns hinterher immer merken, wieviel überhaupt gekommen ist und während der Eingabe müssen wir aufpassen, dass es nicht zu viele Werte sind und kopierbar sind Arrays auch nicht so einfach. Lauter Fehlerquellen, die wir vollständig vermeiden, indem wir einfach eine Datenstruktur nehmen, die mitwächst und die sich selber merkt, wie groß sie ist und die man so behandeln kann wie all die simplen Datentypen und die sich vollautomatisch selbst verwaltet, so dass wir gar nichts mehr tun müssen.
Und alles zusammen und mit kleiner Demo zur Ausgabe (nach C++98, in C++11 geht das auch noch eine Spur eleganter) sieht dann so aus:
#include <iostream> #include <vector> int main() { std::cout << "Zahlen eingeben. Abbruch durch Eingabe einer Nicht-Zahl.\n"; std::vector<int> zahlen; int zahl; while (std::cin >> zahl) zahlen.push_back(zahl); std::cout << "Eingabe war keine Zahl. Bisher eingegebene Zahlen: "; for(int i; i < zahlen.size(); ++i) std::cout << zahlen[i] << ' '; std::cout << '\n'; }Das Programm kann viel mehr als deines (es gibt nachher alle Zahlen aus), ist dabei trotzdem kürzer, gleichzeitig robust gegen alle Fehlerquellen (deines nicht) und auch noch besser erweiterbar und auf jede Plattform mit standardkonformem C++ portabel.
-
Cool, sieht gut aus.
Wenn du mir jetzt noch sagst was daszahlen.push_back(zahl)macht?
-
Es hängt den Wert
zahlhinten an das dynamische Arrayzahlenan. Dieses wird falls nötig dafür vergrößert.Falls dir vector gar nichts sagt, lies erst einmal weiter in deinem Lehrbuch, wo das hoffentlich sehr bald drankommt. Ist sicherlich nützlicher als gleich zu Anfang Details über Arrays zu lernen.
-
Ahh ok.
Naa, ich arbeite nach einem Skript und meistens google ich den Rest.
Das Skript verliert aber kein Wort über Vektoren...Kannst du vielleicht ein Buch empfehlen?

-
user369 schrieb:
Kannst du vielleicht ein Buch empfehlen?

http://www.c-plusplus.net/forum/251551
Und lies das Script nicht weiter. Wenn da nichts über Vectoren drinsteht, dass ist wie ein Englischbuch ohne Verben. Leider gibt es viel zu viele schlechte C++-Lehrwerke, deren Autoren von C (oder noch älteren Sprachen) kommen und denken, wenn sie printf mit cout ersetzen wäre es C++.