Veröffentlicht 15. März 200322 j 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!!!
15. März 200322 j Hi, ich glaube damit wir dir dabei helfen können, wäre es praktisch wenn du uns den entsprechen Quellcode zeigst. Gruß Guybrush
15. März 200322 j 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
15. März 200322 j Eigentlich wird keine Endlosschleife programmiert (das ist nen logischer Fehler), sondern es kommt zu einem Programmabsturz durch die Falscheingabe.
16. März 200322 j 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?
22. März 200322 j Dieser Code allein sollte noch keinen Absturz verursachen. Ich denke, es liegt eher daran, was du danach mit den Daten machst.
22. März 200322 j 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
22. März 200322 j @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?
22. März 200322 j 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
25. März 200322 j 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'); }
25. März 200322 j 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; }
25. März 200322 j 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.
25. März 200322 j 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).
30. März 200322 j 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?
30. März 200322 j 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]
2. April 200322 j 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.
4. April 200322 j Hy! Bei mir funktioniert es jetzt auch, ich habe es doch nicht vor das zweite scanf gesetzt.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.