Wenn es keine Initialisierung gibt ("mod = 0"), geht dieser Code in eine Endlosschleife. Ich kann nicht verstehen, warum dieser Code go loop ist, auch wenn ich getchar () verwendet habe; um den Puffer zu löschen. Wenn ich zuerst "1" und dann "a" tippe, geht eine Endlosschleife. Kann mir jemand helfen, diese Situation zu verstehen?
int main()
{
srand((unsigned)time(NULL));
int mod = 0;
int val = 0;
do {
printf("\t-----------------------------\n");
printf("\t|%5s %5s %5s %5s|\n", "1.create", "2.modify", "3.print", "4.quit");
printf("\t|%15s","Input command : ");
scanf("%d", &mod);
printf("\t-----------------------------\n");
switch (mod){
case 1: random(); val++; break;
case 2: if(val != 0) { modify(); break; }
case 3: if(val != 0) { print(); break; }
default: getchar(); printf("\tUnknown Command!! Retry!! \n"); break;
}
} while (mod != 4);
}
Ich habe diesen Code mit Visual Studio 2015 kompiliert.
2 Antworten
Wenn Sie a
eingeben, ist dies eine ungültige Eingabe für mod
, da scanf()
eine int
für %d
erwartet. Es wird also nicht in mod
eingelesen. Das mod
bleibt also mit dem Wert von mod
belassen, der in der vorherigen Iteration eingegeben wurde.
Der Grund für eine Endlosschleife ist, dass scanf()
die ungültige Eingabe nicht verwirft. Also wiederholt versucht, a
zu lesen und schlägt fehl und die Schleife geht weiter.
Überprüfen Sie den Rückgabewert von scanf()
und verwerfen Sie alle ungültigen Eingaben. scanf()
ist bekanntermaßen schlecht für das Lesen von Benutzereingaben und ordnungsgemäße Eingabefehler bei der Handhabung ist in der Regel härter.
Ein besserer Ansatz besteht darin, eine Zeile -Eingabe mit zu lesen fgets()
und analysieren Sie es anschließend mit {{X1 }}.
do {
...
printf("\t|%15s","Input command : ");
fgets(line, sizeof line, stdin);
char *p = strchr(line, '\n');
if(p) *p = 0; /* remove tailing newline, if present */
if( sscanf(line, "%d", &mod) != 1) {
printf("Invalid input\n");
continue;
}
printf("\t-----------------------------\n");
....
}while (mod != 4);
Das Problem mit Ihrem Code ist, dass nach der Eingabe einer Zahl, die eine gültige Menüoption ist, die Variable mod immer der gleichen Zahl entspricht, die bei der ersten Eingabe eingegeben wurde, wenn Sie eine falsche Eingabe eingeben das zweite Mal. Dieses Verhalten kommt von der Tatsache, dass
scanf(%d, &mod);
Versucht, eine Ganzzahl zu lesen, aber da Sie beispielsweise als zweite Option ein 'a' eingegeben haben, kann die Eingabe keine Ganzzahl aus Ihrer Standardeingabe lesen. Es wird also nicht der Standardfall Ihrer Umschaltmethode eingegeben, da die Variable mod gleich der Eingabe der ersten gültigen Eingabe ist, die Sie eingegeben haben.