2017-04-21 5 views
0

Pour mon affectation, l'utilisateur saisit 5 entiers compris entre 1 et 9 pour représenter cinq jets de dés à 9 faces, qui sont ensuite utilisés pour calculer un score. Nous devons également être en mesure de détecter une entrée invalide, c'est-à-dire autre chose que 5 entiers compris entre 1 et 9. Le problème est que lorsque j'exécute le test automatique de ma tâche, j'obtiens une erreur d'exécution lorsque l'entrée est inférieure à 5 éléments.Contrôle d'erreur avec scanf

Mon erreur code de vérification est (Ignorer la chose countArray, qui est pour plus tard dans le programme):

#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; 
    } 

    ... 

C'est ce que l'auto-test dit:

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 

Je ne suis pas vraiment Assurez-vous de ce qu'il faut faire pour le réparer afin que toute aide soit appréciée.

+0

Où «i» est-il initialisé? – Marievi

+0

whoops ma mauvaise, j'ai oublié de mettre cela, il est initialisé si – Raze

+0

Je ne peux pas reproduire votre problème ... Je cours le code et il attend jusqu'à ce qu'il obtienne 5 éléments. – Marievi

Répondre

0

à mon humble avis immédiatement briser la boucle produit habituellement un code plus lisible que le maintien des drapeaux ..

Dans votre cas, le problème est que si scanf échoue, vous avez pas lu le numéro, mais vous voulez vérifier si elle (la valeur non initialisée) est comprise entre 1 et 9. Ce test ne devrait même pas arriver. Échec rapide.

+0

Alors mettre des déclarations break après à la fois le scanfail = TRUE? – Raze

+0

Je mettrais toute la procédure de lecture dans une fonction séparée et retournerais immédiatement l'échec dans ces cas-là. Drapeau booléen supprimé. –

+0

Oui, ça marche. Je vous remercie!! – Raze