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.

1
Daniel T. Lee 2 Jän. 2016 im 00:39

2 Antworten

Beste Antwort

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);
2
P.P 1 Jän. 2016 im 22:00

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.

1
DZDomi 20 Jän. 2016 im 11:08