2017-02-02 13 views
0

stdinから整数を読み込み、EOFで読み込みを停止するプログラムや、無効な入力があったプログラムを書き込む必要があります。無効な入力がテストされると、 "segmentation fault(core dumped)"というメッセージが表示されます。無効な入力があった場合、どのようにループを終了しますか?ここに私のコードは次のとおりです。Cで無効な入力

int main() 
{ 
    int num, temp, x, j; 
    int i = 0; 
    int arr[ARRAY_MAX]; 

    while (scanf("%d", &num) != EOF) 
    { 
     arr[i] = num; 
     i++; 
    } 

    for (x = 0; x < i; ++x) 
    { 
     for (j = x+1; j < i; ++j) 
     { 
      if (arr[j] < arr[x]) 
      { 
       temp = arr[x]; 
       arr[x] = arr[j]; 
       arr[j] = temp; 
      } 
     } 
    } 

    printf("%d\n", arr[1]); 

    return EXIT_SUCCESS; 
} 
+4

'ARRAY_MAX'の値は何ですか?この最大値を超えてしまうのを防ぐべきではありませんか? –

答えて

2

ため、無効な入力にscanf()0代わりのEOFを返します、あなたは有効な入力のために、それは1する必要があり、この場合には、正しくscanf()の戻り値をチェックしなければなりません。

非常に最初の値が無効な入力であれば、scanf()は失敗しますが、配列要素に割り当てることから読んだときnumは未定義の動作を引き起こし未初期化されます。

while ((scanf("%d", &num) == 1) && (i < ARRAY_MAX)) 

を確認する方法です。

しかし、セグメンテーションフォルトは、iが配列をオーバーフローするのに十分でないことを確認していないためと思われます。私も上記のコードで修正しました。

+0

@ Jean-FrançoisFabre最初の整数が無効な入力として入力された場合、 'scanf()'は失敗し、 'num'は初期化されず未定義の動作になります。 –

関連する問題