scanf () и целочисленный массив - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь создать простую программу, которая выводит максимальное и минимальное значения из пользовательского ввода.

Но для этого всегда требуется больше ввода, чем я намереваюсь.

Кажется чтобы иметь проблему с scanf(), но я не совсем уверен.

int num, max = -100000, min = 1000000;

scanf("%d", &num);

int array[num];

for (int i = 0; i < num; i++) {
    scanf("%d ", &array[i]);
    if (max < array[i])
        max = array[i];

    if (min > array[i])
        min = array[i];
}

printf("%d %d", max, min);

1 Ответ

3 голосов
/ 15 апреля 2020

Конечный пробел в строке формата scanf("%d ", &array[i]); заставляет scanf() использовать все символы новой строки, пока вы не наберете что-то непустое, что вы интерпретируете как требующий дополнительного ввода. Удалите этот завершающий пробел.

Также проверьте возвращаемое значение scanf() для обнаружения неверного ввода.

Кроме того, вам не нужно сохранять значения в массиве.

Также обратите внимание, что -100000 и 1000000 не являются безопасными начальными значениями: что, если все значения, введенные пользователем, ниже или выше этих порогов? Используйте INT_MIN и INT_MAX или проверьте значение индекса.

Вот измененная версия:

#include <limits.h>
#include <stdio.h>

int main() {
    int i, num, val, max = INT_MIN, min = INT_MAX;

    if (scanf("%d", &num) == 1) {
        for (i = 0; i < num; i++) {
            if (scanf("%d ", &val) != 1) {
                printf("invalid input\n");
                break;
            }
            if (val < min)
                min = val;
            if (val > max)
                max = val;
        }
        if (i == 0) {
            printf("no values\n");
        } else {
            printf("%d %d\n", max, min);
        }
    }
    return 0;
}
...