Задать вопрос
  • Как сделать одномерный массив в си?

    includedlibrary
    @includedlibrary
    Либо заранее просить пользователя ввести размер и использовать for:
    int size;
    scanf("%d", &size);
    int *list = malloc(sizeof(int) * size);
    for(int i = 0; i < size; i++)
        scanf("%d", &list[i]);


    Либо как сделали вы.

    Такой код, кстати, list[size++] = n; в какой-то момент приведёт к segfaul, потому что list, очевидно, фиксированного размера, а работа предполагается с массивом переменной длины. Почитайте про malloc/realloc
    Ответ написан
    Комментировать
  • Как сделать одномерный массив в си?

    @res2001
    Developer, ex-admin
    Если количество цифр фиксировано, то просто перечислите в формате scanf сразу их все.
    Если количество цифр может меняться, то ...
    Вводить как строку и потом парсить ее с помощью strtol, кода будет, конечно, больше, чем сейчас.
    Строку вводить в какой-то достаточно большой буфер длинной в 1 или 4 кб.
    При превышении буфера можно выдавать ошибку.
    Или ввод оформить в цикл, на случай, если буфер заполнится, а Enter пользователь еще не нажал. Выход из цикла по нахождению символа '/n' в буфере. В таком случае буфер можно делать меньше. Но тут возникает дополнительная проблема с неоконченным вводом, т.е. пользователь вводит число 123456 и допустим 123 прилетело в конец прошлого буфера, а 456 в начало следующего. Это надо будет решать в коде.

    Есть проблема с фиксированным размером массива.
    Если нужен произвольный размер входных данных, то можно, предварительно выделять массив какого-нибудь начального размера, если в ходе парсинга размер массива превысится, то сделать realloc увеличив размер массива в 2 раза. Ну и надо отдельно хранить количество реально заполненных элементов массива.
    А вообще, массив может оказаться не нужен, если взглянуть на задачу целиком.
    Ответ написан
    1 комментарий