Polo Geschrieben 15. März 2003 Geschrieben 15. März 2003 Hy! Ich habe ein Programm geschrieben, dass bei Eingabe einer falschen Zahl, eine Fehlermeldung ausgeben soll und zwar solange, bis die richtige Eingabe gemacht wurde. Bei meinem Programm kann man zwischen 1, 2 und 3 auswählen. Drückt man z.B. eine 4, so kommt die Fehlermeldung. Das funktioniert auch alles. Drücke ich aber einen Buchstaben oder ein Komma, so erzeugt das Programm eine Endlosschleife. Wie kann ich diesen Fehler im Programm beheben? Vielen Dank schonmal!!! Zitieren
Guybrush Threepwood Geschrieben 15. März 2003 Geschrieben 15. März 2003 Hi, ich glaube damit wir dir dabei helfen können, wäre es praktisch wenn du uns den entsprechen Quellcode zeigst. Gruß Guybrush Zitieren
nic_power Geschrieben 15. März 2003 Geschrieben 15. März 2003 Hallo, Du liest wahrscheinlich ein "int" oder "long" ein. Probiers mal mit einem String und kovertiere diesen in ein int (nach der Gültigkeitsüberprüfung). Nic Zitieren
Der Kleine Geschrieben 15. März 2003 Geschrieben 15. März 2003 Eigentlich wird keine Endlosschleife programmiert (das ist nen logischer Fehler), sondern es kommt zu einem Programmabsturz durch die Falscheingabe. Zitieren
Polo Geschrieben 16. März 2003 Autor Geschrieben 16. März 2003 Hier der Ausschnitt aus dem Quellcode: printf("\n\n1.Oberfläche\n2.Volumen"); printf("\nBitte auswählen: "); scanf("%i",&auswahl); Der Absturz kommt bei Eingabe eines Buchstaben vor, weil ich den Datentyp int genommen habe, nehme ich char, kommt der Absturz bei Zahlen. Gibt es denn einen Datentyp der Zahlen und Zeichen lesen kann oder wie kann ich dieses Problem sonst beheben? Zitieren
Klotzkopp Geschrieben 22. März 2003 Geschrieben 22. März 2003 Dieser Code allein sollte noch keinen Absturz verursachen. Ich denke, es liegt eher daran, was du danach mit den Daten machst. Zitieren
nic_power Geschrieben 22. März 2003 Geschrieben 22. März 2003 Hallo, Der Code kann durchaus einen Absturz verursachen (ist sogar wahrscheinlich). Es wird ein int erwartet; bei der Eingabe eines (oder mehrerer) Buchstaben befindest Du dich aber außerhalb des definierten Bereichs für ein int, folglich muß scanf ungültige Eingaben verarbeiten. Nic Zitieren
Polo Geschrieben 22. März 2003 Autor Geschrieben 22. März 2003 Und wie behebt man dieses Problem? Zitieren
Klotzkopp Geschrieben 22. März 2003 Geschrieben 22. März 2003 @nic_power: IIRC lässt scanf den int unverändert, wenn es keine Zahlen zum Umwandeln findet. Kannst du ein Beispiel bringen, das abstürzt? Zitieren
nic_power Geschrieben 22. März 2003 Geschrieben 22. März 2003 Originally posted by Klotzkopp @nic_power: IIRC lässt scanf den int unverändert, wenn es keine Zahlen zum Umwandeln findet. Stimmt. Da habe ich wohl was durcheinander geworfen. Im Allgemeinen liest scanf solange ein, bis der Format-String nicht mehr "passt". @Polo: Poste doch bitte mal das vollständige Programm. Nic Zitieren
Stevie Geschrieben 25. März 2003 Geschrieben 25. März 2003 Originally posted by Polo Hier der Ausschnitt aus dem Quellcode: printf("\n\n1.Oberfläche\n2.Volumen"); printf("\nBitte auswählen: "); scanf("%i",&auswahl); Der Absturz kommt bei Eingabe eines Buchstaben vor, weil ich den Datentyp int genommen habe, nehme ich char, kommt der Absturz bei Zahlen. Gibt es denn einen Datentyp der Zahlen und Zeichen lesen kann oder wie kann ich dieses Problem sonst beheben? Versuch's mal so: #include <conio.h> #include <stdio.h> #include <stdlib.h> void main() { char auswahl; do { system("cls"); printf("\n\n1.Oberfläche\n2.Volumen"); printf("\nBitte auswählen: "); auswahl = getch(); } while (auswahl != '1' && auswahl != '2'); } Zitieren
Polo Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Ich habe deine Idee mal ausprobiert, hat aber nicht funktioniert! Hier ist der Quellcode: Wird hier eine falsche Zahl eingegeben, erscheint ganz normal die Fehlermeldung. Gibt man aber einen Buchstaben ein, erzeugt er die Endlosschleife! #include <stdio.h> #define PAUSE {printf("\n\n\n\Beenden\n");fflush(stdin);getchar();} main() { int wahl; printf("\n\n\n1.Quader\n\n2.Kegel\n\n3.Kugel"); printf("\n\n\nBitte waehlen Sie aus: "); scanf("%i",&wahl); while (wahl!=1&&wahl!=2&&wahl!=3) { printf("\nFalsche Eingabe!"); printf("\n\n\nBitte waehlen Sie aus: "); scanf("%i",&wahl); } PAUSE; } Zitieren
Crow T. Robot Geschrieben 25. März 2003 Geschrieben 25. März 2003 Hallo Polo! Vielleicht hilft dir die Tatsache, dass die Funktion scanf() einen Rückgabewert hat, nämlich die Anzahl Zeichen, die erfolgreich verarbeitet wurden. Wenn du also eine Zahl einlesen möchtest, der Benutzer aber nur Buchstaben eintippt, bekommst du eine 0 (null) zurückgeliefert. Die Variable, deren Adresse du als zweiten Parameter übergibst, bleibt in dem Fall natürlich auch unverändert (was auch immer zuvor drinstand). Das solltest du zusätzlich beachten und entsprechend reagieren. Zitieren
nic_power Geschrieben 25. März 2003 Geschrieben 25. März 2003 Das Problem ist, dass die Eingabe "a" im Eingabepuffer stehen bleibt und vom scanf() innerhalb der Schleife erneut gelesen wird. Aber auch innerhalb der Schleife bleibt "a" im Puffer, da es eine Falscheingabe ist usw. usf (--> Endlosschleife). Gibst Du eine Zahl an, tritt der Fehler nicht auf, da die Eingabe von scanf() korrekt konvertiert werden kann. Nic PS: Du solltest kein fflush() auf stdin machen (führt unter Umständen zu Fehlern). Zitieren
Polo Geschrieben 30. März 2003 Autor Geschrieben 30. März 2003 Ich dachte mir auch schon, dass es daran liegt. Weißt du auch wie man das Programm schreiben kann, so dass dieses Problem nicht mehr auftritt? Zitieren
Klotzkopp Geschrieben 30. März 2003 Geschrieben 30. März 2003 Um den Eingabepuffer zu leeren, kannst du diesen beiden Zeilen vor den scanf-Aufruf setzen: setvbuf( stdin, NULL, _IONBF, 0 ); setvbuf( stdin, NULL, _IOFBF, BUFSIZ );[/CODE] Zitieren
Polo Geschrieben 2. April 2003 Autor Geschrieben 2. April 2003 Ich habe deine Idee mal ausprobiert, jedoch trat das Problem weiterhin auf! Zitieren
Klotzkopp Geschrieben 2. April 2003 Geschrieben 2. April 2003 Originally posted by Polo Ich habe deine Idee mal ausprobiert, jedoch trat das Problem weiterhin auf! Bei mir funktioniert das mit MSVC 7 und Dev-C++ 4.9.7. Hast du die Zeilen vor das zweite scanf gesetzt? Wenn ja, zeig bitte mal deinen kompletten Code. Zitieren
Polo Geschrieben 4. April 2003 Autor Geschrieben 4. April 2003 Hy! Bei mir funktioniert es jetzt auch, ich habe es doch nicht vor das zweite scanf gesetzt. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.