C-Programmierung - Wiederholen scanf, bis nur noch zahlen eingegeben werden
Was ich wan ' T zu tun, ist zu überprüfen, ob meine Eingabe ist eine Zahl und dann weiter, sonst drucken Sie ein Falsches format und bitten um einen neuen Eingang. Was ich bekomme ist eine endlose Schleife drucken "Falschen format"
Dies ist meine Funktion für die Eingangs-Nummer:
void input_number(int *number)
{
printf("Number: ");
if ( scanf("%d", number) == 1 )
return 0;
else
{
printf("-> Wrong format, try again! <-\n");
input_number(number); //start over
}
}
Wenn ich das Programm ausführen will ich es in etwa so Aussehen:
Nummer: Hallo
-> Falsches format, versuchen Sie es erneut! <-
Nummer: 4
und gehen auf....
- Nicht die Ursache des Problems ist, aber Sie wollen nicht, Rekursion zu verwenden, für die Zwecke der Wiederholungen. Auch, Sie sind re-calling
input_number
ob Sie erfolgreich die Eingabe eine Zahl ist oder nicht. Sie sind fehlende Klammern ({}
) rund um Ihrenelse
- Klausel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das problem ist, dass, wenn die
scanf()
schlägt fehl, weil entweder EOF ist oder weil es ein nicht-numerisches Zeichen in den input-stream, das problem besteht immer noch, wenn Sie das nächste mal, damit es wieder fehlschlägt, und dies wird fortgesetzt, bis das Programm läuft von Ressourcen oder Sie laufen aus Geduld.Zumindest, müssen Sie unterscheiden zwischen:
Wenn Sie erwarten, dass eine einzelne Zahl pro Zeile, dann ist es wahrscheinlich am besten zu verwenden
fgets()
undsscanf()
. Wenn Sie mit dem zufrieden sind, mehrere Nummern pro Zeile, dann haben Sie ein bisschen härter arbeiten. Sollte man wohl auch einen Wert zurückgeben von der Funktion zu zeigen, ob es erfolgreich war oder nicht.Beachten Sie die korrekte Verwendung von
feof()
; eine I/O-operation fehlgeschlagen ist, und der code muss unterscheiden zwischen EOF und I/O-Fehler und format-Fehler.In der zweiten Funktion, wenn die
printf()
fehlschlägt, werden Sie fälschlicherweise gesagt, dass eine Zahl war zu Lesen. Wenn das ein problem ist, fügen Sie zusätzliche tests, aber, der code ist schon schwieriger zu schreiben, als den code mitfgets()
, so vorsichtig sein, über die Entscheidung, es zu benutzen.Beachten Sie, dass der ursprüngliche code hatte
return 0;
in einer Funktion zurückgebenvoid
. Der code sollte, wurde abgelehnt durch den compiler.Versuchen, diese : ( Vorsicht es gibt viel viel bessere Möglichkeiten, dies zu tun )
Ausgabe:
Versuchen Sie es mit einer Schleife, überprüft die Benutzereingaben und versucht zu analysieren, es zu einer int. Wenn es nicht gelingt, kann es zu halten, um dem Benutzer für die Eingabe, bis Sie geben Sie ein Tatsächliches int.
An diesem Punkt werden Sie wahrscheinlich wissen, dass es gibt einige Fehler in Ihrem code und die Rekursion ist nicht die beste Idee. Dies ist ein Versuch zu machen Ihre - code arbeiten, ziemlich oder nicht.