2017-04-21 9 views
0

私の割り当てのために、ユーザは1から9までの5つの整数を入力し、9面のダイスロールを5つ表示し、スコアを計算します。また、入力を検出できないようにする必要があります.1〜9の5つの整数以外のものが必要です。問題は、自分のタスクの自動テストを実行すると、入力が5つ以下のときにランタイムエラーが発生するということです。scanfによるエラーチェック

される私のエラーチェックコード(countArrayの事を無視するには、それはプログラムの後半でのためです):

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 

私は本当にないよ:

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

    ... 

これは、自動テストが言うことですそれを修正するために何をすべきかを確認してください。すぐにループを壊す

+0

「i」はどこに初期化されていますか? – Marievi

+0

私はコードを実行し、それが5つの要素を取得するまで待機しますが、 – Raze

+0

私はあなたの問題を再現できませんが、それを入れて忘れて、whoops私の悪いです。 – Marievi

答えて

0

私見では、通常のフラグを維持するよりも読みやすいコードを生成します。..

あなたのケースでは問題はscanf関数が失敗した場合、あなたは数を読んでいない、まだあなたが(それかどうかを確認したいということです初期化されていない値)は1と9の間です。 ファストファースト

+0

したがって、scanfail = TRUEの後にbreak文を入れますか? – Raze

+0

私は、読取り手順全体を別の関数に入れ、そのような場合には直ちに失敗を返します。ブールフラグが削除されました。 –

+0

それはうまく動作します。ありがとうございました!! – Raze

関連する問題