2017-02-02 8 views
0

Мне нужно написать программу, которая читает целые числа из stdin и перестает читать в EOF или если есть недопустимый ввод. Когда проверяется недействительный вход, я получаю сообщение с сообщением «ошибка сегментации (сбрасывается ядром)». Как я могу выйти из цикла при наличии недопустимого ввода? Вот мой код:Недопустимый ввод в 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'? не следует ли вам защищать от «i' перехода на это максимальное значение? –

ответ

2

Поскольку при некорректном вводе scanf() вернет 0 вместо EOF, вы должны проверить возвращаемое значение scanf() правильно, в этом случае для допустимого ввода должна быть 1.

Если очень первое значение неверного ввод, scanf() потерпит неудачу и num будет инициализирован вызывает неопределенное поведение при чтении из него, чтобы назначить элемент массива.

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

- это способ проверить это.

Ошибка сегментации, по-видимому, связана с тем, что вы не уверены, что i недостаточно велик для переполнения массива. Который я также исправил в коде выше.

+0

@ Jean-FrançoisFabre Если самое первое целое число введено как недопустимый ввод, 'scanf()' будет терпеть неудачу, а 'num' будет неинициализирован, что приведет к неопределенному поведению. –

 Смежные вопросы

  • Нет связанных вопросов^_^