2017-04-21 6 views
0

Für meine Aufgabe gibt der Benutzer 5 ganze Zahlen zwischen 1 und 9 ein, um fünf 9-seitige Würfelwürfe darzustellen, die dann zur Berechnung einer Punktzahl verwendet werden. Wir müssen auch in der Lage sein, Eingaben zu erkennen und ungültig zu machen, d. H. Alles andere als 5 ganze Zahlen zwischen 1 und 9. Das Problem ist, dass wenn ich den automatischen Test für meine Aufgabe ausführen, bekomme ich einen Laufzeitfehler, wenn die Eingabe weniger als 5 Dinge ist.Fehlerprüfung mit scanf

Mein Fehlerprüfcode wird (Ignorieren Sie die countArray Sache, das ist später im Programm):

#include <stdio.h> 
#include <stdlib.h> 

#define TRUE 1 
#define FALSE 0 

#define ARRAY_SIZE 5 

... 

int main(void) { 

    int numbers[ARRAY_SIZE]; 
    int scanFail = 0; 

    int i = 0; 

     ... 

     // Check for if 5 integers between 1 and 9 have been entered 

    while (i < ARRAY_SIZE && scanFail == FALSE) { 

     if (scanf("%d", &numbers[i]) != 1) { 
      scanFail = TRUE; 
     } 

     if (numbers[i] < 1 || numbers[i] > 9) { 
      scanFail = TRUE; 
     } 

     countArray[i] = ARRAY_NOT_COUNTED; 
     i++; 

    } 

    if (scanFail == TRUE) { 
     printf("Invalid Input: 5 integers 1..9 must be supplied.\n"); 
     return EXIT_FAILURE; 
    } 

    ... 

Dies ist, was der Autotest sagt:

Test10 (1 2 3) - failed (errors) 

    Your program produced these errors: 

    Runtime error: uninitialized variable accessed. 

    Execution stopped here in main() in youChew.c at line 65: 

    \t\t} 
    \t\t 
    -->\t\t if (numbers[i] < 1 || numbers[i] > 9) { 
    \t\t scanFail = TRUE; 
    \t\t} 

    Values when execution stopped: 

    i = 3 
    numbers = {1, 2, 3, 69513217, -22336628} 
    scanFail = 1 
    numbers[i] = 69513217 

    Test 11 (potato) - failed (errors) 

    Your program produced these errors: 

    Runtime error: uninitialized variable accessed. 

    Execution stopped here in main() in youChew.c at line 65: 

    \t\t} 
    \t\t 
    -->\t\t if (numbers[i] < 1 || numbers[i] > 9) { 
    \t\t scanFail = TRUE; 
    \t\t} 

    Values when execution stopped: 

    i = 0 
    numbers = {69515968, 0, 8192, 69513217, -18240628} 
    scanFail = 1 
    numbers[i] = 69515968 

Ich bin nicht wirklich sicher, was zu tun, um es zu reparieren, so dass jede Hilfe geschätzt wird.

+0

Wo ist 'i' initialisiert? – Marievi

+0

Whoops mein schlechtes, vergaß, das in, es ist initialisiert obwohl – Raze

+0

Ich kann nicht reproduzieren Ihr Problem ... Ich führe den Code und es wartet, bis es 5 Elemente bekommt. – Marievi

Antwort

0

IMHO sofort bricht in der Regel die Schleife als die Aufrechterhaltung Flaggen lesbaren Code erzeugt ..

In Ihrem Fall ist das Problem, dass, wenn Scanf ausfällt, Sie die Nummer nicht gelesen haben, noch wollen Sie, ob es überprüfen (der nicht initialisierte Wert) liegt zwischen 1 und 9. Dieser Test sollte nicht einmal passieren. Fehler schnell.

+0

So setzen Sie Break Statements nach beiden der Scanfail = TRUE? – Raze

+0

Ich würde den gesamten Lesevorgang in eine separate Funktion stellen und in diesen Fällen sofort einen Fehler zurückgeben. Boolesches Flag wurde entfernt. –

+0

Ja, das funktioniert. Vielen Dank!! – Raze